Introduction

Overview
Wars are complex events born of geopolitical, cultural or economic strife, oftentimes spanning many years but ultimately costing us lives, our livelihood and peace. During wars, countries quickly adopt ideologies, form allegiances, and discipline their economic and scientific priorities while maintaining their military focus with a blind adherence. Although the causes of this displacement of peace may vary, is there a precursory pattern to it? Does the landscape change after the end of a prolonged conflict? Do certain actors benefit more? Do some lose more than others? And most importantly, could there be important predictors of these epic events that change the course of history?

Our Aim
We are particularly interested in studying the changes that happen to a country before and after they enter a war. We want to see the change of alliances and strategies, it’s impact on trade and commerce and the economics at play. We also want to compare and contrast the characteristics of countries who won wars with the ones that lost. Our eventual goal is to find certain factors that indicate which countries will enter into a war and how these factors/predictors change over time.

Scope and Timeline
To limit our scope we will explore the data with a particular emphasis on the United States of America and the wars it has fought since 1900. At various points, we may have to include comparisons between countries and the US and we will explore the data breadth-wise to draw meaningful insights.

For our timeline, we plan to look at events/activity leading to, during and following the major US wars, namely;
WWI ————————– 1914-1918
WWII ————————- 1939-1945
Cold War ——————– 1947-1991
Korean War —————- 1950-1953
Vietnam War ————— 1955-1975
War in Afghanistan ——- 2001-2010

The Data, Team Members and The Roles

The Correlates of War Project is a treasure trove of information. We have a special interest in the following datasets: Trade, National Materials Capabilities, Alliances and Militarized Interstate Disputes.

Our Plan
We’ve decided to divide and conquer the work by each taking a subset of the data and exploring it. After sometime, we will regroup to see what we’ve learnt so far and switch data sets amongst ourselves to see if there are more insights to be learnt or different approaches to visualize the existing data. Lastly, we want to drill down into particular variables and plot correlations or predictors for the final output.

Phase 1:
* Cynthia to analyze National Materials Capabilities and Alliances
* Vineet to analyze Militarized Interstate Disputes and Trade

Phase 2:
* We are going to switch the data sets we are looking at to see if the other person can discern any new insights or creative ways of presenting the data.
+ Cynthia to analyze Militarized Interstate Disputes and Trade
+ Vineet to analyze National Materials Capabilities and Alliances

Phase 3: * Cynthia and Vineet to come together and look at the interaction of different variables. For example how did a change in trade impact the NMC.

Analysis of Data Quality

Provide a detailed, well-organized description of data quality, including textual description, graphs, and code.

The Correlates of War datasets are a product of the Correlate of War Project (COW) founded in 1963. COW’s goal is to “facilitate the collection, dissemination, and use of accurate and reliable quantitative data in international relations.” [add source] From the COW datasets we focused on 4 datasets: NMC, MID, Alliances and Trade.

Overall

in this section we can talk about Consistency, conformity and integrity

Overall the consistency of these data sets is quite good. We have not found any evidence of conflicting information.

for each individual data set address accuracy, completeness, and dulpication

National Materials Capabilities

The overall data quality of NMC dataset is very good. There are roughly 14,000 entries and 89% of them did not have any missing values. There is one data entry for each country per year. The accuracy of the data is also very good because as countries are dissolved and new ones are formed, this data keeps track of them. For example, the graph depicts the CINC of Austria-Hungary from 1900-1918, the end of WWI when it the Austro-Hungarian Empire was dissolved. Immediately after that, you see data points for Austria and Hungary separately.This same accuracy hold true for many different coutries, where there is only data once the country has declared independence or has just been created.

NMC_test <- NMC_orig
NMC_test$cinc[NMC_test$cinc == -9] <- NA
NMC_test$irst[NMC_test$irst == -9] <- NA
NMC_test$milex[NMC_test$milex == -9] <- NA
NMC_test$milper[NMC_test$milper== -9] <- NA
NMC_test$pec[NMC_test$pec == -9] <- NA
NMC_test$tpop[NMC_test$tpop == -9] <- NA
NMC_test$upop[NMC_test$upop == -9] <- NA
NMC_test <- filter(NMC_test, NMC_test$year %in% c(1900:2007))
test <- c("Austria-Hungary", "Austria", "Hungary")
test_ccode <- member_alliances$ccode[match(test, member_alliances$state_name)]
NMC_test <- filter(NMC_test, NMC_test$ccode %in% test_ccode)
ggplot() + 
  scale_x_continuous(name="Year") + 
  scale_y_continuous(name="CINC") +
  labs(color ='Country Abbreviation')+
  geom_rect(data=d, mapping=aes(xmin=x1, xmax=x2, ymin=0, ymax=.09, fill=Conflict),alpha=0.15) +
  geom_line(data = NMC_test, aes(x = year, y = cinc, color = stateabb, group = stateabb)) +
  ggtitle("CINC for Austria-Hungary") + 
  theme_classic()+
  scale_fill_manual(values=c("salmon", "paleturquoise3", "lightsteelblue2", "lightsteelblue4", "lightsteelblue3", "pink3"))+
  scale_color_brewer(palette="Paired")+
  theme(plot.title = element_text(hjust = .5), legend.position = "bottom") 

Alliances

The overall data quality of the data set was very good. The information in the alliances data matched exactly with historical facts

Graph of NATO Alliance and when the members joined Members

version id == 227

Some of the inconsistencies that I noticed are in cases where the alliance is still in effect as of the 12/31/2012, which was when this data set was last updated. In some of the datasets, if the alliance is ongoing, it would have the dyad_end_year, the field that represents the year in which the alliance was terminated, set to 2012 and in other data sets it would have it set as ‘NA’. In the case that dyad_end_year is set to 2012, it was hard to know if there were any alliances that ended in 2012 or if they were an ongoing alliance.

  1. US had only one alliance before 1925 and Japan has no more alliances now
qa <- filter(dir_al_year, dir_al_year$state_name1 %in% c("United States of America"))
qa <- qa[, c(3,5,8,11,18)]
qa$dyad_end_year[qa$dyad_end_year %in% NA] = 2016
#qa <- gather(qa, st_ed, year, dyad_st_year:dyad_end_year )
ggplot() + 
  geom_point(data =qa, aes(x=year, y = state_name2), alpha = .5) +
  xlab("Year") +
  ylab("Country")+
  ggtitle("")+
  theme_classic() 

Trade

Militarized Interstate Disputes

Below for reference only - this is what we want to talk to in this section

Completeness: Is all the requisite information available? Are data values missing, or in an unusable state? In some cases, missing data is irrelevant, but when the information that is missing is critical to a specific business process, completeness becomes an issue.

Conformity: Are there expectations that data values conform to specified formats? If so, do all the values conform to those formats? Maintaining conformance to specific formats is important in data representation, presentation, aggregate reporting, search, and establishing key relationships.

Consistency: Do distinct data instances provide conflicting information about the same underlying data object? Are values consistent across data sets? Do interdependent attributes always appropriately reflect their expected consistency? Inconsistency between data values plagues organizations attempting to reconcile between different systems and applications.

Accuracy: Do data objects accurately represent the “real-world” values they are expected to model? Incorrect spellings of product or person names, addresses, and even untimely or not current data can impact operational and analytical applications.

Duplication: Are there multiple, unnecessary representations of the same data objects within your data set? The inability to maintain a single representation for each entity across your systems poses numerous vulnerabilities and risks.

Integrity: What data is missing important relationship linkages? The inability to link related records together may actually introduce duplication across your systems. Not only that, as more value is derived from analyzing connectivity and relationships, the inability to link related data instance together impedes this valuable analysis.

Based on the data how strong are your observations

Executive Summary

Provide a short nontechnical summary of the most revealing findings of your analysis with no more than 3 static graphs or one interactive graph (or link), written for a nontechnical audience. The length should be approximately 2 pages (if we were using pages…) Do not show code, and take extra care to clean up your graphs, ensuring that best practices for presentation are followed.

National Materials Capabilities

Alliances

Trade

Militarized Interstate Disputes

Main Analysis

Provide a detailed, well-organized description of your findings, including textual description, graphs, and code. Your focus should be on both the results and the process. Include, as reasonable and relevant, approaches that didn’t work, challenges, the data cleaning process, etc.

National Materials Capabilities

NMC <- NMC_orig 
NMC$cinc[NMC$cinc == -9| is.na(NMC$cinc)] <- 0
NMC$irst[NMC$irst == -9| is.na(NMC$irst)] <- 0
NMC$milex[NMC$milex == -9| is.na(NMC$milex)] <- 0
NMC$milper[NMC$milper== -9| is.na(NMC$milper)] <- 0
NMC$pec[NMC$pec == -9| is.na(NMC$pec)] <- 0
NMC$tpop[NMC$tpop == -9| is.na(NMC$tpop)] <- 0
NMC$upop[NMC$upop == -9| is.na(NMC$upop)] <- 0
all_year <- c(1900:2007)
NMC_ratios <- c("")
for (year_t in all_year){
  yr <- filter(NMC, NMC$year %in% year_t) 
  max <- apply(yr[, c(4:9)], 2, sum)
  #max <- as.numeric(max[4:9])
  for (i in 4:9){
    yr[,i] = as.numeric(yr[,i]/max[i-3])
  }
  NMC_ratios <- smartbind(NMC_ratios , yr)
}
NMC_ratios  <- NMC_ratios [c(2:nrow(NMC_ratios )), c(2:length(NMC_ratios))]
cbbPalette <- c("#000000", "#E69F00", "#56B4E9", "#009E73", "#F0E442", "#0072B2", "#D55E00", "#CC79A7")

National Materials Capability measures the power of a country based on 6 values: total population, urban population, military personnel, military expenditures, iron and steel production and energy consumption. NMC is purely a measure of military and economic means of influence rather than diplomacy or other forms of influence.

CINC is the composite score to measure the power of a country using the average of the ratios, calculated as described below.

[] (./cinc_calc.png)

Below is the CNIC score for major powers today who also participated the major wars in the past. Also highlighted are the years wars mentioned above.

```{r fig.width=5, fig.height=2.5}

countries <- c("United States of America", "United Kingdom", "France", "Russia","Germany", "Japan", "China")
country_code <- member_alliances$ccode[match(countries, member_alliances$state_name)]
NMC_mp <- filter(NMC, NMC$year %in% all_year)
NMC_mp <- filter(NMC_mp, NMC_mp$ccode %in% country_code)
NMC_mp$country = ""
for( i in c(1:length(country_code))){
  NMC_mp$country[NMC_mp$ccode == country_code[i]] <- countries[i]
}
ggplot() + 
  scale_x_continuous(name="Year") + 
  scale_y_continuous(name="CINC") +
  labs(color ='Country')+
  geom_rect(data=d, mapping=aes(xmin=x1, xmax=x2, ymin=0, ymax=max(NMC_mp$cinc), fill=Conflict),alpha=0.15) +
  geom_line(data = NMC_mp, aes(x = year, y = cinc, color = country, group = stateabb)) +
  ggtitle("CNIC by Year for Major Powers Today") + 
  theme_classic()+
  scale_fill_manual(values=c("salmon", "paleturquoise3", "lightsteelblue2", "lightsteelblue4", "lightsteelblue3", "pink3"))+
  scale_color_brewer(palette="Paired")+
  theme(plot.title = element_text(hjust = .5), legend.position = "bottom") 

NA

As you can see CNIC is constantly changing. Interestingly, the CNIC spikes for the US right after WWI and WWII where the US had a major role in the outcome of the wars. There is also an increase in the US’s CINC score during the Korean War. Following the Korean War, the US’s CINC score shows a continuous decrease during the Vietnam where the US lost the war. At the end of WWI, you see Russia’s CNIC dip low but it bounced back to its CNIC before WWI pretty quickly. During the Vietnam War, Russia supported the Vietnamese people and you see the its CINC score increase above that of the US as they start to gain ground in the war. Also Russia’s CINC score drops low towards the end of the Cold War as the satellite states start gaining their independence and the USSR was dissolved.

To explore the trends more, the data was refined to only look at the major participants of each war. For example, with WWI we looked at the CINC values for major players in the Allied Powers and Central Powers a few years before and after the war. We replicated this process for all the events listed above. Below are CINC graphs using this approach for WWI and WWII.

allied <- c("United States of America", "United Kingdom", "Russia", "Japan", "Italy")
allied_ccode <- member_alliances$ccode[match(allied, member_alliances$state_name)]
central <- c("Germany", "Turkey", "Austria-Hungary", "Romania", "Bulgaria")
central_ccode <- member_alliances$ccode[match(central, member_alliances$state_name)]
WWI_range = c(1904:1930)
WWI<- filter(NMC, NMC$year %in% WWI_range)
alliedP<- filter(WWI, WWI$ccode %in% allied_ccode)
alliedP$side = "Allied Powers"
for( i in c(1:length(allied_ccode))){
  alliedP$country[alliedP$ccode == allied_ccode[i]] <- paste(allied[i],"(Allied)", sep = " ")
}
centralP<- filter(WWI, WWI$ccode %in% central_ccode)
centralP$side = "Central Powers "
for( i in c(1:length(central_ccode))){
  centralP$country[centralP$ccode == central_ccode[i]] <- paste(central[i], "(Central)", sep = " ")
}
WWI <-rbind(alliedP, centralP)
ww1 <- ggplot() + 
  labs(color ='Country')+
  xlab("Year") +
  ylab("CNIC")+
  geom_rect(data=d, mapping=aes(xmin=1914, xmax=1918, ymin=0, ymax=.4),alpha=0.05, fill ="salmon") +
  geom_line(data = WWI, aes(x = year, y = cinc, color = country, group = country)) + 
  facet_wrap(~side) + 
  theme_classic()+
  scale_color_brewer(palette="Paired")+
  ggtitle("CNIC Score: WWI Major Players ")+
   theme(plot.title = element_text(hjust = .5),legend.position="right")
allies <- c("United States of America", "United Kingdom", "France", "Russia", "Australia","China")
allies_ccode <- member_alliances$ccode[match(allies, member_alliances$state_name)]
axis <- c("Germany", "Italy", "Japan", "Hungary", "Romania", "Bulgaria")
axis_ccode <- member_alliances$ccode[match(axis, member_alliances$state_name)]
WWII_range = c(1934:1950)
WWII<- filter(NMC, NMC$year %in% WWII_range)
alliedP2<- filter(WWII, WWII$ccode %in% allies_ccode)
alliedP2$side = "Allies"
for( i in c(1:length(allies_ccode))){
  alliedP2$country[alliedP2$ccode == allies_ccode[i]] <- paste(allies[i], "(Allies)", sep = " ")
}
axisP<- filter(WWII, WWII$ccode %in% axis_ccode)
axisP$side = "Axis"
for( i in c(1:length(axis_ccode))){
  axisP$country[axisP$ccode == axis_ccode[i]] <- paste(axis[i], "(Axis)", sep = " ")
}
WWII <-rbind(alliedP2, axisP)
ww2 <- ggplot() + 
  labs(color ='Country')+
  xlab("Year") +
  ylab("CNIC")+
  geom_rect(data=d, mapping=aes(xmin=1939, xmax=1945, ymin=0, ymax=.4),alpha=0.05, fill ="paleturquoise3") +
  geom_line(data = WWII, aes(x = year, y = cinc, color = country, group = stateabb)) + 
  facet_wrap(~side) + 
  theme_classic()+
  scale_color_brewer(palette="Paired")+
  ggtitle("CNIC Score: WWII Major Players ")+
  theme(plot.title = element_text(hjust = .5),legend.position="right")

```{r fig.width=5, fig.height=4}

grid.arrange(ww1, ww2, nrow=2)

As mentioned, with WWI the US’s CINC spiked right after the war and then began to steadily decrease till the beginning of the WWII. Russia’s CINC dropped but rose again pretty quickly and stayed on a relatively upward trend till WWII. Unlike the US and Russia, United Kingdom’s CINC was steadily decreasing after the war. Italy and Japan’s CINC remained steady. With the Central Powers after WWI, Germany’s CINC dropped but it did not rise again. Turkey’s, Romania’s and Bulgaria’s CINC remained steady. We see the Austria-Hungarian CINC disappear after the war since the Austro-Hungarian empire was dissolved at the end of the war.

With WWII, we see a similar pattern for the US where the CNIC reaches a peak at the end of WWII and steadily decreases till the Korean war. Russia also shows a similar pattern to WWI where its CINC score reaches a low point towards the end of WWII and then continues to steadily increase till the Korean war. The UK also follows a similar pattern where it CINC peaks right after the war and then steadily decreases throughout the Cold War time period. With the Axis powers, Germany’s and Japan’s CINC drops off.

To explore the patters above, we looked into the components that make up the CINC. We chose to focus on the major powers because they had the most drastic changes during this time period. We looked at both the actual value and the ratio because the absolute values gradually increased over time but the ratios show performance relative to the other countries each year. Looking at the ratios helped us to see trends that were not easy to spot when looking at the overall values. Below is a plot of five of the six CINC components, the values and the ratios

```{r fig.width=8, fig.height=7 }

grid.arrange(arrangeGrob(ias, ias_r, mex, mex_r, mip, mip_r + theme(plot.title = element_text(hjust = .5), legend.position="none"),nrow=3, ncol =2),mylegend, heights=c(10,1))

#grid.arrange(ias, ias_r, mex, mex_r, mip, mip_r, urp, urp_r, top, top_r, nrow=6)

With the Iron and Steel Production ratio, you can see that it follows to same pattern as the CINC for the US during this time period. The ratio peaks towards the end of WWI and WWII and decreases in the time period between the two wars. Till about the beginning of the Vietnam War, roughly 1955, the US dominated the world in Iron and Steel production and so this value had huge impact the US’s CINC score. Generally, during most wars, the US has the most military production but lost its position toward s the end of the Vietnam war when Russia surpassed the US. The United Kingdom maintained its iron and steel production, but since USA and Russia were increasing their production, the UKs ratio has been steadily decreasing since the 1900s, very similar to the pattern observed with the CINC score.

Looking at military expenditure we see that the US and Russia had been significantly investing more in the military throughout the cold war. On the other hand, both countries decrease their military personnel after they peaked at the end of WWII. These findings are consistent with the Cold War where the US and Russia were in an arms race where they heavily invested in military technology but did not engage in any large scale battles. The US’s military expenditures ratio peaks the same year its CINC score and iron and steel production ratio.

In the few years before WWII, you see Germany’s military expenditures ratio increase quite rapidly and the military personnel ratio saw a drastic increase in the one year before increasing quite rapidly. Although not as drastic, Japan and China follow a similar pattern where the military investment increased significantly a few years prior to WWII and the Korean War, respectively, and the military personnel ratio drastically increased right before the wars. This suggests that in years before the wars, these countries started investing in and preparing their militaries for war. The countries that were on the reactive side, the US, Russia and the UK, their military production ratios and military expenditures ratios only increased during the war.

```{r fig.width=3, fig.height=1}

NMC_v<- filter(NMC_ratios, NMC_ratios$year %in% c(1970:2000))
NMC_ratios_v<- filter(NMC_ratios, NMC_ratios$year %in% c(1970:2000))
#names <- c("North Korea", "South Korea", "Afghanistan"  , "Vietnam", "Republic of Vietnam")
#code<- c(731, 732,700, 816, 817)
names <- c("Iraq")
code <- c(645)
NMC_v<- filter(NMC_v, NMC_v$ccode %in% code)
NMC_ratios_v<- filter(NMC_ratios_v, NMC_ratios_v$ccode %in% code)
for( i in c(1:length(code))){
  NMC_ratios_v$country[NMC_ratios_v$ccode == code[i] ]<- names[i]
  NMC_v$country[NMC_v$ccode == code[i] ]<- names[i]
}
a<- ggplot() + 
  scale_x_continuous(name="Year") + 
  scale_y_continuous(name="Ratio") + 
  geom_line(data = NMC_ratios_v, aes(x = year, y = milex), colour = "indianred3") +
  ggtitle("Iraq Military Expenditures Ratio") + 
  geom_rect(data=d, mapping=aes(xmin=1990, xmax=1991, ymin=0, ymax=.025),alpha=0.03) +
  theme_classic() +
  theme(plot.title = element_text(hjust = .5, size =10 ),   axis.text.x =element_text(size =6), axis.text.y =element_text(size =6), axis.title.x =element_text(size =8), axis.title.y =element_text(size =8), legend.position="none")
b<- ggplot() + 
  scale_x_continuous(name="Year") + 
  scale_y_continuous(name="Ratio") +
  geom_line(data = NMC_ratios_v, aes(x = year, y = milper), colour= "royalblue3") +
  ggtitle("Iraq Military Personnel Ratio") + 
  geom_rect(data=d, mapping=aes(xmin=1990, xmax=1991, ymin=0, ymax=.05), alpha=0.03) +
  theme_classic() +
  theme(plot.title = element_text(hjust = .5, size =10 ),   axis.text.x =element_text(size =6), axis.text.y =element_text(size =6), axis.title.x =element_text(size =8), axis.title.y =element_text(size =8), legend.position="none")
grid.arrange(a,b,nrow = 1)

We wanted to see if this this same pattern was present in other conflicts. During the Gulf War, Iraq invaded Kuwait and it was met with international condemnation and the US and other nations joined forces to stop Iraq. But before the invasion in war we see Iraq’s military expenditures and personnel ratios increasing. The gray shaded box indicates the time period of the Gulf War (1990-1991). In the 1980s, Iraq’s military expenditure ratio drastically increased and then there was a sudden spike in military personnel right before the start of the war.

```{r fig.width=7.5, fig.height= 3}

ct <- c("United States of America", "United Kingdom", "France", "Russia","Germany", "Italy", "Japan", "China")
ct_ccode <- member_alliances$ccode[match(ct, member_alliances$state_name)]
NMC_ct <- filter(NMC, NMC$year %in% all_year)
NMC_ct <- filter(NMC_ct, NMC_ct$ccode %in% ct_ccode)
for( i in c(1:length(ct_ccode))){
  NMC_ct$country[NMC_ct$ccode == ct_ccode[i]] <- ct[i]
}
a<- ggplot(NMC_ct, aes(country, year, fill = cinc)) + geom_tile()+
  xlab("Country") +
  ylab("Year") +
  scale_fill_viridis() + 
  ggtitle("CINC Heatmap for Major Powers") + 
  theme_classic()+
  theme(plot.title = element_text(hjust = 0.5))+ 
  coord_flip() +
  labs(color ='CINC')
topCas <- c("Netherlands", "Yugoslavia", "Lithuania", "Poland", "Austria", "Hungary", "Romania", "Estonia", "Luxembourg")
topCas_ccode <- member_alliances$ccode[match(topCas, member_alliances$state_name)]
NMC_cas <- filter(NMC, NMC$year %in% all_year)
NMC_cas <- filter(NMC_cas, NMC_cas$ccode %in% topCas_ccode)
for( i in c(1:length(topCas_ccode))){
  NMC_cas$country[NMC_cas$ccode == topCas_ccode[i]] <- topCas[i]
}
b<- ggplot(NMC_cas, aes(country, year, fill = cinc)) + geom_tile()+
  xlab("Country") +
  ylab("Year") +
  scale_fill_viridis() + 
  ggtitle("CINC Heatmap for Countries with the most Holocaust Casualties") + 
  theme_classic()+
  theme(plot.title = element_text(hjust = 0.5)) +
  coord_flip() +
  labs(color ='CINC')
  
grid.arrange(a,b, nrow = 1 )

Finally, using the heat maps, we looked at impact on CINC after a war. On the left is a heat map of the major powers. You can see that France, Germany and Japan had missing CINC values at the end of World War II. Those periods of missing values correspond to the recovery period for each of those countries following the war. Next, we looked to see what other coutries had gaps in their CINC data. Most of the countries that have missing gaps are Eastern European countries that where heaviliy impacted by the Holocaust and by the struggle to end Communism in the region. This indiactes that for countries that are going through intense destruction or reformation, they do not have any CINC information.

Next Steps To get even more into detail and context around certain characteristics, we want to look at specific events like pearl harbor or China’s invasion of Malaysia and other pivotal moments in wars to see how those events impact the CINC and its various components.

A problem with NMC is that there are many other factors that determine a power of a nation rather than the 6 NMC factors. One of the major considerations that is not taken into account are diplomatic relations and dealings. Diplomatic relations play a major role is the prevention and conclusion of conflicts. With this data, it was not possible to factor that in.

Additionally, another thing to consider is differences in policies between different countries. We see that military expenditures have been increasing for the US since the Cold War but Russia’s military expenditures take a sudden drop at the end of the Cold War. Since then Russia has been cutting military spending till today. Even with its participation in the Afghanistan War, Russia’s military expenditures have not increase. On the contrary, in the US today, politicians are proposing a Federal Budgets with increases in military spending. This difference is due to differences in policies of the countries. Thus the reactions of countries to events will drastically vary based on their policies and it because hard to distinguish an overall pattern.

Another drawback of NMC is that it cannot take into account changes in universal priorities. For example, with an increased concern for climate change and scare natural resources and also with advancements in technology, iron and steel production might start to decrease drastically in the future so it may no longer be a valid measure of power. Similarly, advancements in technoloy would decrease the need for military personeel. The issue with NMC is that it cannot take such policy concerns and changes into consideration to measure national power.

Alliances

dayd_al_year <- filter(dyad_al_year, dyad_al_year$year %in% c(1900:2012))
dyad_al_year$length = dyad_al_year$dyad_end_year - dyad_al_year$dyad_st_year
dayd_al_year$conflict <- "0"
dyad_al_year$count <- 1 
dir_alliances <- gather(dir_al_year, treaty_type, idicator, defense:entente)
dir_alliances <- dir_alliances[!dir_alliances$idicator %in%  0,]
dir_alliances$dyad_end_year[dir_alliances$dyad_end_year %in% NA] = 2016
dir_alliances <- dir_alliances[dir_alliances$year>1900,]
alliance_count <- dir_alliances[, c(2,3,14,16)]
alliance_count$count <- 1 
gp_ct <- aggregate(cbind(count) ~ ccode1+state_name1+year+treaty_type, data =alliance_count, FUN = sum )
gp_ct$Conflict <- "0"
for(i in c(1:length(d$x1))){
  gp_ct[gp_ct$year >= d$x1[i] & gp_ct$year <= d$x2[i], length(gp_ct)] <- as.character(i)
}

WWI was triggered by the assassination of the Archduke Franz Ferdinand of Austria. His death set off diplomatic crisis as countries that were not involved in the original conflict were forced to get involved. Once Austria declared war on Serbia for the death of the Arch Duke, Russia had to step into defend Serbia. Once Russia entered the conflict, Germany was forced to enter the conflict due to its alliance with Austria. During the conflict Germany invaded Belgium; in response, the United Kingdom mobilized due to their alliance with Belgium. This pattern continued to eventually involve all the major powers of the world for a devastating battle. Such alliances were the cause of World War I. Since then the number of Alliances has only grown and continues to grow. For this reason, we wanted to look at alliances and see how they change during wars.

Below is boxplot of the total number of alliances that are in effect each year between any two countries. It is easy to see that the median number of alliances jumped up significantly during WWII and continued to grow during the Cold War and remained relatively level since then. An interesting pattern is that the median number of alliances increased more in the 1-3 before the end of war. You can see this patter with WWI, Korean War, Vietnam War and the end of the Cold War. Although the Cold War was only a state of severe political war there were many regional battles and the threat of a large-scale military war was constant. The number of alliances significantly increased from the start of the Cold War till the end.

```{r fig.width=10, fig.height=5}

ggplot() +
  xlab("Year") +
  ylab("Count")+
  geom_boxplot(data = gp_ct, aes(x = as.factor(year), y = count, fill = Conflict)) +
  ggtitle("Total Alliances by Year") + 
  theme_classic()+
  theme(plot.title = element_text(hjust = .5, size = 20), axis.text.x = element_text(angle = 90, size = 10),  axis.text.y = element_text(size = 15),  axis.title.y = element_text(size = 15), axis.title.x = element_text(size = 15),  legend.position="bottom", legend.text = element_text(size=15),  legend.title = element_text(size=15))+
  scale_fill_manual(values=c("white", "lightsteelblue3", "pink3", "paleturquoise3", "lightsteelblue2", "lightsteelblue4","salmon" ), labels = mylables)

Next we looked at the types of alliances formed during this time. The COW data reports on 4 types of alliances: defense, neutrality, entente and non-aggression. In a defense alliance, the member states agree to defend one or more states in alliance in the event of a conflict. With a neutrality alliance, there is an agreement to maintain neutrality towards the members of the alliance. In non-aggression alliance, the members agree to take no military action against one another. Finally, with an entente alliance there is an understanding that the states would consult with one another if a crisis occurred

The plots below show the number of alliances by alliance type. The top row shows the number of new alliances that were formed each year and the second row shows number of alliances that were terminated that year. Please note that if an alliance was formed between 4 states then there would 6 new alliances in the data set because there is an alliance between each of the 4 members. Similarly, if an alliance between 4 states were terminated that would be 6 less alliances.

```{r fig.width=8, fig.height=4}

dir_al_0 <- filter(dir_al, dir_al$dyad_st_year %in% c(1900:2012))
all_st <- gather(dir_al_0, treaty_type, idicator, defense:entente)
all_st <- all_st[!all_st$idicator %in%  0,]
all_st$dyad_end_year[all_st$dyad_end_year %in% NA] = 2016
al_st_count <- all_st[, c(3,5,8,11,15)]
al_st_count$count <- 1 
gp_st <- aggregate(cbind(count) ~ dyad_st_year+treaty_type, data =al_st_count, FUN = sum )
a <- ggplot() +
  xlab("Year") +
  ylab("Count")+
  geom_bar(data = al_st_count, aes(x = dyad_st_year)) +
  ggtitle("Total Alliances by Year they started")+
  geom_rect(data=d, mapping=aes(xmin=x1, xmax=x2, ymin=0, ymax=max(450), fill=Conflict),alpha=0.2)+
  ggtitle("Number of Alliances Formed") +
  theme_classic()+
  theme(legend.position="bottom", plot.title = element_text(hjust = .5)) + 
  scale_fill_manual(values=c("salmon", "paleturquoise3", "lightsteelblue2", "lightsteelblue4", "lightsteelblue3", "pink3")) + facet_wrap(~treaty_type, nrow = 1 )
b<- ggplot() +
  xlab("Year") +
  ylab("Count")+
  geom_bar(data = al_st_count[al_st_count$dyad_end_year < 2016, ], aes(x = dyad_end_year)) +
  ggtitle("Number of Alliances Terminated")+
  geom_rect(data=d, mapping=aes(xmin=x1, xmax=x2, ymin=0, ymax=max(450), fill=Conflict),alpha=0.2)+
  theme_classic()+
  theme(legend.position="bottom", plot.title = element_text(hjust = .5)) + 
  scale_fill_manual(values=c("salmon", "paleturquoise3", "lightsteelblue2", "lightsteelblue4", "lightsteelblue3", "pink3")) + facet_wrap(~treaty_type, nrow = 1)
grid.arrange(a,b, nrow =2)

Most of the alliances formed were at the end of WWII and during the Cold War. Also, the most frequently formed alliances were defense and entente. Surprisingly, in years that see a large increase in the number of alliances formed there is also an increase in the number of alliances that were terminated. To dig in further to get a better understand of what types of treaties were formed and why they ended, we looked at individual countries.

The following charts are all organized the same way, they show a timeline of when the alliances started till either the end of the alliance (shown in red) or till 2012 if the alliance was observed in effect as of December 31, 2012 (shown in blue). The charts are facetted to show the different types of alliances because many of the alliance types overlap. For example, one alliance could be both a defense and entente alliance, so to get a better visual representation we separated the types of alliances. We focused this part of the analysis on the United States, United Kingdom, Russia, and Germany because these countries are major powers and thus are involved in many of the military alliances throughout history.

United States of America

```{r fig.width=7.5, fig.height = 5}

al_us_yr <- filter(dir_al_year, dir_al_year$state_name1 %in% "United States of America")
al_us_yr <- gather(al_us_yr, Treaty, idicator, defense:entente)   
al_us_yr <- al_us_yr[!al_us_yr$idicator %in%  0,]
al_us_yr$dyad_end_year[al_us_yr$dyad_end_year %in% NA] = 2016
al_us_yr <- al_us_yr[, c(5,8,11,14,16)]
al_us_yr$count = 1 
al_us_yr$Status <- ""
al_us_yr$Status[al_us_yr$dyad_end_year < 2012] <- "Ended"
al_us_yr$Status[al_us_yr$dyad_end_year== 2012] <- "Ongoing"
ggplot() + 
  xlab("Year") +
  ylab("Country")+
  geom_point(data =al_us_yr, aes(x=year, y = state_name2, color =Status), alpha = .5) + 
  geom_rect(data=d, mapping=aes(xmin=x1, xmax=x2, ymin="Afghanistan", ymax="Zimbabwe", fill=Conflict),alpha=0.15) + 
  ggtitle("US Alliances ")+
  theme_classic()+
  scale_fill_manual(values=c("salmon", "paleturquoise3", "lightsteelblue2", "lightsteelblue4", "lightsteelblue3", "pink3")) + facet_wrap(~treaty_type, nrow = 1)+
  facet_wrap(~Treaty, nrow = 1 ) +
  theme(legend.position="right", plot.title = element_text(hjust = .5)) 

Looking at the alliances for the US, we see that most defense alliances are still in effect today. There were handful of alliances with South American countries that ended towards the end of WWII but the US entered into a different alliance with those same countries immediately. The treaties in effect with the South American countries is the Inter-American Treaty of Reciprocal Assistance (Rio Pact) where if there is an attack against one country, it is considered an attack among all the Americas countries in the alliance. This alliance was created n 1949 and continues till today.

You can also see a similar pattern of ongoing alliances for defense entente and nonaggression treaty types. NATO, a defensive, entente and nonaggression alliance, was formed in 1947 and is still in effect till today. NATO involves 28 countries and accounts for the high number of alliances formed in 1949 for the 3 types.

The entente alliances follow a similar pattern where the alliance ended and was immediately reformed. There were a few countries where there was an entente alliance formed towards the end of the Korean War and ended a few years after the end of the Vietnam war. The majority of the countries that follow the described patters are in Asia or Australia. This is reasonable considering they were participants is the Vietnam War. Also the defense and entente alliance between the US and Cuba ended during the Vietnam War, indicated in the graph above, when Cuba was providing military support to the Vietnamese. Also, during the Vietnam war, there was a neutrality alliance for a few years between the US and countries that participated in the Vietnam war. This alliance was called the International Agreement on the Neutrality of Laos starting in 1961 and was terminaded when was Democratic Republic of Vietnam violated the terms of the treaty 2 years later.

United Kingdom

dir_al_year2 <- filter(dir_al_year, dir_al_year$dyad_st_year %in% c(1900:2016))
al_gb_yr <- filter(dir_al_year2, dir_al_year2$state_name1 %in% c("United Kingdom"))
al_gb_yr <- gather(al_gb_yr, Treaty, idicator, defense:entente)   
al_gb_yr <- al_gb_yr[!al_gb_yr$idicator %in%  0,]
al_gb_yr <- al_gb_yr[, c(3,5,8,11,14,16)]
al_gb_yr$count = 1 
al_gb_yr$Status[al_gb_yr$dyad_end_year < 2012] <- "Ended"
al_gb_yr$Status[al_gb_yr$dyad_end_year== 2012] <- "Ongoing"
ggplot() + 
  xlab("Year") +
  ylab("Country")+
  geom_point(data =al_us_yr, aes(x=year, y = state_name2, color =Status), alpha = .5) + 
  geom_rect(data=d, mapping=aes(xmin=x1, xmax=x2, ymin="Afghanistan", ymax="Zimbabwe", fill=Conflict),alpha=0.15) + 
  ggtitle("United Kingdom Alliances")+
  theme_classic()+
  scale_fill_manual(values=c("salmon", "paleturquoise3", "lightsteelblue2", "lightsteelblue4", "lightsteelblue3", "pink3")) + facet_wrap(~treaty_type, nrow = 1)+
  facet_wrap(~Treaty, nrow = 1 ) +
  theme(legend.position="right", plot.title = element_text(hjust = .5)) 

The United Kingdom follows the same pattern as the United States. Most of the defense alliances started towards the end of WWII and are still in effect today. The United Kingdom is part of NATO so we see a high number of defense, entente and non-aggression treaty types formed in 1949 and continue till today. The UK was also part of the Neutrality of Laos alliance and we can see that in the neutrality plot.

Germany

al_gmy_yr <- filter(dir_al_year2, dir_al_year2$state_name1 %in% c("Germany"))
al_gmy_yr <- gather(al_gmy_yr, Treaty, idicator, defense:entente)   
al_gmy_yr <- al_gmy_yr[!al_gmy_yr$idicator %in%  0,]
al_gmy_yr <- al_gmy_yr[, c(5,8,11,14,16)]
al_gmy_yr$count = 1 
al_gmy_yr$Status[al_gmy_yr$dyad_end_year < 2012] <- "Ended"
al_gmy_yr$Status[al_gmy_yr$dyad_end_year== 2012] <- "Ongoing"
ggplot() + 
  xlab("Year") +
  ylab("Country")+
  geom_point(data =al_gmy_yr, aes(x=year, y = state_name2, color =Status), alpha = .5) + 
  geom_rect(data=d, mapping=aes(xmin=x1, xmax=x2, ymin="Afghanistan", ymax="Zimbabwe", fill=Conflict),alpha=0.15) + 
  ggtitle("Germany Alliances")+
  theme_classic()+
  scale_fill_manual(values=c("salmon", "paleturquoise3", "lightsteelblue2", "lightsteelblue4", "lightsteelblue3", "pink3")) + facet_wrap(~treaty_type, nrow = 1)+
  facet_wrap(~Treaty, nrow = 1 ) +
  theme(legend.position="right", plot.title = element_text(hjust = .5)) 

As Germany was heavily impacted by WWII, we see all its alliances end by the end of the war. During its recovery period, Germany was not a part of any military alliance. This is to be as expected since Germany was so devastated by the war it could not afford to maintain the military. Germany was also going through a period of civil unrest. In 1990, Germany joined NATO after East and West Germany combined to from a unified Germany.

Russia

al_rus_yr <- filter(dir_al_year2, dir_al_year2$state_name1 %in% c("Russia"))
al_rus_yr <- gather(al_rus_yr, Treaty, idicator, defense:entente)   
al_rus_yr <- al_rus_yr[!al_rus_yr$idicator %in%  0,]
al_rus_yr <- al_rus_yr[, c(5,8,11,14,16)]
al_rus_yr$count = 1 
al_rus_yr$Status[al_rus_yr$dyad_end_year < 2012] <- "Ended"
al_rus_yr$Status[al_rus_yr$dyad_end_year== 2012] <- "Ongoing"
ggplot() + 
  xlab("Year") +
  ylab("Country")+
  geom_point(data =al_rus_yr, aes(x=year, y = state_name2, color =Status), alpha = .5) + 
  geom_rect(data=d, mapping=aes(xmin=x1, xmax=x2, ymin="Afghanistan", ymax="Zimbabwe", fill=Conflict),alpha=0.15) + 
  ggtitle("Russia Alliances")+
  theme_classic()+
  scale_fill_manual(values=c("salmon", "paleturquoise3", "lightsteelblue2", "lightsteelblue4", "lightsteelblue3", "pink3")) + facet_wrap(~treaty_type, nrow = 1)+
  facet_wrap(~Treaty, nrow = 1 ) +
  theme(legend.position="right", plot.title = element_text(hjust = .5)) 

China

al_china_yr <- filter(dir_al_year2, dir_al_year2$state_name1 %in% c("China"))
al_china_yr <- gather(al_china_yr, Treaty, idicator, defense:entente)   
al_china_yr <- al_china_yr[!al_china_yr$idicator %in%  0,]
al_china_yr <- al_china_yr[, c(5,8,11,14,16)]
al_china_yr$count = 1 
al_china_yr$Status[al_china_yr$dyad_end_year < 2012] <- "Ended"
al_china_yr$Status[al_china_yr$dyad_end_year== 2012] <- "Ongoing"
ggplot() + 
  xlab("Year") +
  ylab("Country")+
  geom_point(data =al_rus_yr, aes(x=year, y = state_name2, color =Status), alpha = .5) + 
  geom_rect(data=d, mapping=aes(xmin=x1, xmax=x2, ymin="Afghanistan", ymax="Zimbabwe", fill=Conflict),alpha=0.15) + 
  ggtitle("China Alliances")+
  theme_classic()+
  scale_fill_manual(values=c("salmon", "paleturquoise3", "lightsteelblue2", "lightsteelblue4", "lightsteelblue3", "pink3")) + facet_wrap(~treaty_type, nrow = 1)+
  facet_wrap(~Treaty, nrow = 1 ) +
  theme(legend.position="right", plot.title = element_text(hjust = .5)) 

Conclusions

Since we are mainly focusing on large-scale wars that involved various countries, many treaties were created and broken. For example, Warsaw Pact was created as a counter weight to the NATO Pact created at end of WWII. The US, Great Britain and their allies became part of NATO and the Soviet Union and its Allies became part of the Warsaw pact. Once the USSR dissolved many of the satellite nations, the Warsaw Pact members joined NATO. Such military. With NATO and the formation of the United Nations, it is hard to say which countries will participate in the next war. For example, before the beginning of the War on Afghanistan, the security council had to authorize the United States and NATO allies to organize an offensive against al-Qaeda. This type of regulation makes it hard to determine how future wars will play out. One thing that was interesting is that once a treaty falls apart, the members try to join another treaty which is why we see spikes is the median number of alliances towards the end of the wars.

One of the things that was hard to work with this data set is that it was impossible to tell which alliances were part of a larger treaty. For example, if there was a data point for an alliance between the US and the UK in 1967, there was no indication of if it was NATO or some other treaty. This also made it hard to tell when a country joined an existing alliance. For example, when Germany joined NATO there were data points for an alliance between Germany and the NATO members but it is not easy to discern that Germany join NATO without some internet research.

The other downfall of this data set is that it only considers formal military alliances. It will not take into account other types of alliances such as the United Nations & security council or a trade agreement. For example, Japan is not in any military alliance currently but it does have very close ties to the United States today, and this information is not captured in the data set.

Trade

Militarized Interstate Disputes

Conclusion

Discuss limitations and future directions, lessons learned

Sources

LS0tCnRpdGxlOiAiVGFsZSBvZiBXYXIiCm91dHB1dDogaHRtbF9ub3RlYm9vawphdXRob3I6ICJDeW50aGlhIENsZW1lbnQgJiBWaW5lZXQgQWd1aWFyIgotLS0KYGBge3IsIGVjaG8gPSBGQUxTRX0KCiMjIExvYWQgUGFja2FnZXMgCgpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoZ3JpZCkKbGlicmFyeShncmlkRXh0cmEpCmxpYnJhcnkodGlkeXIpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkodmlyaWRpcykKbGlicmFyeShndG9vbHMpCmxpYnJhcnkoUkNvbG9yQnJld2VyKQoKCiMjaW1wb3J0IGRhdGEKCiNOTUMKCiNOTUNfb3JpZyA9IHJlYWQuY3N2KCIvVXNlcnMvY3ludGhpYWNsZW1lbnQvRURBVl9Qcm9qZWN0XzIwMTcvZGF0YS9OTUNfNV8wL05NQ181XzAuY3N2Iiwgc2VwPSAiLCIpCk5NQ19vcmlnID0gcmVhZC5jc3YoIi4vZGF0YS9OTUNfNV8wL05NQ181XzAuY3N2Iiwgc2VwPSAiLCIpCgojQWxsaWFuY2VzIApkeWFkX2FsXzA9IHJlYWQuY3N2KCIuL2RhdGEvdmVyc2lvbjQuMV9jc3YvYWxsaWFuY2VfdjQuMV9ieV9keWFkLmNzdiIsIHNlcD0gIiwiKQpkeWFkX2FsX3llYXIgPSByZWFkLmNzdigiLi9kYXRhL3ZlcnNpb240LjFfY3N2L2FsbGlhbmNlX3Y0LjFfYnlfZHlhZF95ZWFybHkuY3N2Iiwgc2VwPSAiLCIpCgptZW1iZXJfYWxsaWFuY2VzID0gcmVhZC5jc3YoIi4vZGF0YS92ZXJzaW9uNC4xX2Nzdi9hbGxpYW5jZV92NC4xX2J5X21lbWJlci5jc3YiLCBzZXA9ICIsIikKbWVtYmVyX2FsX3llYXIgPSByZWFkLmNzdigiLi9kYXRhL3ZlcnNpb240LjFfY3N2L2FsbGlhbmNlX3Y0LjFfYnlfbWVtYmVyX3llYXJseS5jc3YiLCBzZXA9ICIsIikKCmRpcl9hbF95ZWFyPSByZWFkLmNzdigiLi9kYXRhL3ZlcnNpb240LjFfY3N2L2FsbGlhbmNlX3Y0LjFfYnlfZGlyZWN0ZWRfeWVhcmx5LmNzdiIsIHNlcD0gIiwiKQpkaXJfYWw9IHJlYWQuY3N2KCIuL2RhdGEvdmVyc2lvbjQuMV9jc3YvYWxsaWFuY2VfdjQuMV9ieV9kaXJlY3RlZC5jc3YiLCBzZXA9ICIsIikKCiMjIEV2ZW50cyBEYXRhIEZyYW1lIAoKZD1kYXRhLmZyYW1lKHgxPWMoMTkxNCwxOTM5LCAxOTQ3LCAxOTUwLCAxOTU1LCAyMDAxKSwgeDI9YygxOTE4LCAxOTQ1LCAxOTkxLCAxOTUzLCAxOTc1LCAyMDEwKSwgQ29uZmxpY3Q9YygiV1dJIiwgIldXSUkiLCAiQ29sZCBXYXIiLCAiS29yZWFuIFdhciIsICJWaWV0bmFtIFdhciIsICJBZmdoYW5pc3RhbiBXYXIiKSwgcj1jKDEsMiwzLDQsNSw2KSkKCm15bGFibGVzIDwtIGMoIk5vIFdhciIgLCAiV1dJIiwgIldXSUkiLCAiQ29sZCBXYXIiLCAiS29yZWFuIFdhciIsICJWaWV0bmFtIFdhciIsICJBZmdoYW5pc3RhbiBXYXIiKQpgYGAKCgojI0ludHJvZHVjdGlvbgoKKipPdmVydmlldyoqICAKV2FycyBhcmUgY29tcGxleCBldmVudHMgYm9ybiBvZiBnZW9wb2xpdGljYWwsIGN1bHR1cmFsIG9yIGVjb25vbWljIHN0cmlmZSwgb2Z0ZW50aW1lcyBzcGFubmluZyBtYW55IHllYXJzIGJ1dCB1bHRpbWF0ZWx5IGNvc3RpbmcgdXMgbGl2ZXMsIG91ciBsaXZlbGlob29kIGFuZCBwZWFjZS4gRHVyaW5nIHdhcnMsIGNvdW50cmllcyBxdWlja2x5IGFkb3B0IGlkZW9sb2dpZXMsIGZvcm0gYWxsZWdpYW5jZXMsIGFuZCBkaXNjaXBsaW5lIHRoZWlyIGVjb25vbWljIGFuZCBzY2llbnRpZmljIHByaW9yaXRpZXMgd2hpbGUgbWFpbnRhaW5pbmcgdGhlaXIgbWlsaXRhcnkgZm9jdXMgd2l0aCBhIGJsaW5kIGFkaGVyZW5jZS4gQWx0aG91Z2ggdGhlIGNhdXNlcyBvZiB0aGlzIGRpc3BsYWNlbWVudCBvZiBwZWFjZSBtYXkgdmFyeSwgaXMgdGhlcmUgYSBwcmVjdXJzb3J5IHBhdHRlcm4gdG8gaXQ/IERvZXMgdGhlIGxhbmRzY2FwZSBjaGFuZ2UgYWZ0ZXIgdGhlIGVuZCBvZiBhIHByb2xvbmdlZCBjb25mbGljdD8gRG8gY2VydGFpbiBhY3RvcnMgYmVuZWZpdCBtb3JlPyBEbyBzb21lIGxvc2UgbW9yZSB0aGFuIG90aGVycz8gQW5kIG1vc3QgaW1wb3J0YW50bHksIGNvdWxkIHRoZXJlIGJlIGltcG9ydGFudCBwcmVkaWN0b3JzIG9mIHRoZXNlIGVwaWMgZXZlbnRzIHRoYXQgY2hhbmdlIHRoZSBjb3Vyc2Ugb2YgaGlzdG9yeT8gCgoqKk91ciBBaW0qKiAgCldlIGFyZSBwYXJ0aWN1bGFybHkgaW50ZXJlc3RlZCBpbiBzdHVkeWluZyB0aGUgY2hhbmdlcyB0aGF0IGhhcHBlbiB0byBhIGNvdW50cnkgYmVmb3JlIGFuZCBhZnRlciB0aGV5IGVudGVyIGEgd2FyLiBXZSB3YW50IHRvIHNlZSB0aGUgY2hhbmdlIG9mIGFsbGlhbmNlcyBhbmQgc3RyYXRlZ2llcywgaXQncyBpbXBhY3Qgb24gdHJhZGUgYW5kIGNvbW1lcmNlIGFuZCB0aGUgZWNvbm9taWNzIGF0IHBsYXkuIFdlIGFsc28gd2FudCB0byBjb21wYXJlIGFuZCBjb250cmFzdCB0aGUgY2hhcmFjdGVyaXN0aWNzIG9mIGNvdW50cmllcyB3aG8gd29uIHdhcnMgd2l0aCB0aGUgb25lcyB0aGF0IGxvc3QuIE91ciBldmVudHVhbCBnb2FsIGlzIHRvIGZpbmQgY2VydGFpbiBmYWN0b3JzIHRoYXQgaW5kaWNhdGUgd2hpY2ggY291bnRyaWVzIHdpbGwgZW50ZXIgaW50byBhIHdhciBhbmQgaG93IHRoZXNlIGZhY3RvcnMvcHJlZGljdG9ycyBjaGFuZ2Ugb3ZlciB0aW1lLiAKCioqU2NvcGUgYW5kIFRpbWVsaW5lKiogIApUbyBsaW1pdCBvdXIgc2NvcGUgd2Ugd2lsbCBleHBsb3JlIHRoZSBkYXRhIHdpdGggYSBwYXJ0aWN1bGFyIGVtcGhhc2lzIG9uIHRoZSBVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EgYW5kIHRoZSB3YXJzIGl0IGhhcyBmb3VnaHQgc2luY2UgMTkwMC4gQXQgdmFyaW91cyBwb2ludHMsIHdlIG1heSBoYXZlIHRvIGluY2x1ZGUgY29tcGFyaXNvbnMgYmV0d2VlbiBjb3VudHJpZXMgYW5kIHRoZSBVUyBhbmQgd2Ugd2lsbCBleHBsb3JlIHRoZSBkYXRhIGJyZWFkdGgtd2lzZSB0byBkcmF3IG1lYW5pbmdmdWwgaW5zaWdodHMuICAKCkZvciBvdXIgdGltZWxpbmUsIHdlIHBsYW4gdG8gbG9vayBhdCBldmVudHMvYWN0aXZpdHkgbGVhZGluZyB0bywgZHVyaW5nIGFuZCBmb2xsb3dpbmcgdGhlIG1ham9yIFVTIHdhcnMsIG5hbWVseTsgIApXV0kgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gMTkxNC0xOTE4ICAKV1dJSSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAxOTM5LTE5NDUgIApDb2xkIFdhciAtLS0tLS0tLS0tLS0tLS0tLS0tLSAxOTQ3LTE5OTEgIApLb3JlYW4gV2FyIC0tLS0tLS0tLS0tLS0tLS0gMTk1MC0xOTUzICAKVmlldG5hbSBXYXIgLS0tLS0tLS0tLS0tLS0tIDE5NTUtMTk3NSAgCldhciBpbiBBZmdoYW5pc3RhbiAtLS0tLS0tIDIwMDEtMjAxMCAKCgojIyBUaGUgRGF0YSwgVGVhbSBNZW1iZXJzIGFuZCBUaGUgUm9sZXMKClRoZSBbQ29ycmVsYXRlcyBvZiBXYXIgUHJvamVjdF0oaHR0cDovL3d3dy5jb3JyZWxhdGVzb2Z3YXIub3JnKSBpcyBhIHRyZWFzdXJlIHRyb3ZlIG9mIGluZm9ybWF0aW9uLiBXZSBoYXZlIGEgc3BlY2lhbCBpbnRlcmVzdCBpbiB0aGUgZm9sbG93aW5nIGRhdGFzZXRzOiBUcmFkZSwgTmF0aW9uYWwgTWF0ZXJpYWxzIENhcGFiaWxpdGllcywgQWxsaWFuY2VzIGFuZCBNaWxpdGFyaXplZCBJbnRlcnN0YXRlIERpc3B1dGVzLiAKCioqT3VyIFBsYW4qKiAgCldlJ3ZlIGRlY2lkZWQgdG8gZGl2aWRlIGFuZCBjb25xdWVyIHRoZSB3b3JrIGJ5IGVhY2ggdGFraW5nIGEgc3Vic2V0IG9mIHRoZSBkYXRhIGFuZCBleHBsb3JpbmcgaXQuIEFmdGVyIHNvbWV0aW1lLCB3ZSB3aWxsIHJlZ3JvdXAgdG8gc2VlIHdoYXQgd2UndmUgbGVhcm50IHNvIGZhciBhbmQgc3dpdGNoIGRhdGEgc2V0cyBhbW9uZ3N0IG91cnNlbHZlcyB0byBzZWUgaWYgdGhlcmUgYXJlIG1vcmUgaW5zaWdodHMgdG8gYmUgbGVhcm50IG9yIGRpZmZlcmVudCBhcHByb2FjaGVzIHRvIHZpc3VhbGl6ZSB0aGUgZXhpc3RpbmcgZGF0YS4gTGFzdGx5LCB3ZSB3YW50IHRvIGRyaWxsIGRvd24gaW50byBwYXJ0aWN1bGFyIHZhcmlhYmxlcyBhbmQgcGxvdCBjb3JyZWxhdGlvbnMgb3IgcHJlZGljdG9ycyBmb3IgdGhlIGZpbmFsIG91dHB1dC4KCipQaGFzZSAxOiogIAoqIEN5bnRoaWEgdG8gYW5hbHl6ZSBOYXRpb25hbCBNYXRlcmlhbHMgQ2FwYWJpbGl0aWVzIGFuZCBBbGxpYW5jZXMgIAoqIFZpbmVldCB0byBhbmFseXplIE1pbGl0YXJpemVkIEludGVyc3RhdGUgRGlzcHV0ZXMgYW5kIFRyYWRlICAKCipQaGFzZSAyOiogIAoqIFdlIGFyZSBnb2luZyB0byBzd2l0Y2ggdGhlIGRhdGEgc2V0cyB3ZSBhcmUgbG9va2luZyBhdCB0byBzZWUgaWYgdGhlIG90aGVyIHBlcnNvbiBjYW4gZGlzY2VybiBhbnkgbmV3IGluc2lnaHRzIG9yIGNyZWF0aXZlIHdheXMgb2YgcHJlc2VudGluZyB0aGUgZGF0YS4gIAogICsgQ3ludGhpYSB0byBhbmFseXplIE1pbGl0YXJpemVkIEludGVyc3RhdGUgRGlzcHV0ZXMgYW5kIFRyYWRlICAKICArIFZpbmVldCB0byBhbmFseXplIE5hdGlvbmFsIE1hdGVyaWFscyBDYXBhYmlsaXRpZXMgYW5kIEFsbGlhbmNlcyAgIAoKKlBoYXNlIDM6KgoqIEN5bnRoaWEgYW5kIFZpbmVldCB0byBjb21lIHRvZ2V0aGVyIGFuZCBsb29rIGF0IHRoZSBpbnRlcmFjdGlvbiBvZiBkaWZmZXJlbnQgdmFyaWFibGVzLiBGb3IgZXhhbXBsZSBob3cgZGlkIGEgY2hhbmdlIGluIHRyYWRlIGltcGFjdCB0aGUgTk1DLiAKCgojIyBBbmFseXNpcyBvZiBEYXRhIFF1YWxpdHkgCgoqKlByb3ZpZGUgYSBkZXRhaWxlZCwgd2VsbC1vcmdhbml6ZWQgZGVzY3JpcHRpb24gb2YgZGF0YSBxdWFsaXR5LCBpbmNsdWRpbmcgdGV4dHVhbCBkZXNjcmlwdGlvbiwgZ3JhcGhzLCBhbmQgY29kZS4gKioKClRoZSBDb3JyZWxhdGVzIG9mIFdhciBkYXRhc2V0cyBhcmUgYSBwcm9kdWN0IG9mIHRoZSBDb3JyZWxhdGUgb2YgV2FyIFByb2plY3QgKENPVykgZm91bmRlZCBpbiAxOTYzLiBDT1cncyBnb2FsIGlzIHRvICJmYWNpbGl0YXRlIHRoZSBjb2xsZWN0aW9uLCBkaXNzZW1pbmF0aW9uLCBhbmQgdXNlIG9mIGFjY3VyYXRlIGFuZCByZWxpYWJsZSBxdWFudGl0YXRpdmUgZGF0YSBpbiBpbnRlcm5hdGlvbmFsIHJlbGF0aW9ucy4iIFthZGQgc291cmNlXSBGcm9tIHRoZSBDT1cgZGF0YXNldHMgd2UgZm9jdXNlZCBvbiA0IGRhdGFzZXRzOiBOTUMsIE1JRCwgQWxsaWFuY2VzIGFuZCBUcmFkZS4gCgoqKk92ZXJhbGwqKgoKKmluIHRoaXMgc2VjdGlvbiB3ZSBjYW4gdGFsayBhYm91dCBDb25zaXN0ZW5jeSwgY29uZm9ybWl0eSBhbmQgaW50ZWdyaXR5KgoKCk92ZXJhbGwgdGhlIGNvbnNpc3RlbmN5IG9mIHRoZXNlIGRhdGEgc2V0cyBpcyBxdWl0ZSBnb29kLiBXZSBoYXZlIG5vdCBmb3VuZCBhbnkgZXZpZGVuY2Ugb2YgY29uZmxpY3RpbmcgaW5mb3JtYXRpb24uCgoKCipmb3IgZWFjaCBpbmRpdmlkdWFsIGRhdGEgc2V0IGFkZHJlc3MgYWNjdXJhY3ksIGNvbXBsZXRlbmVzcywgYW5kIGR1bHBpY2F0aW9uKgoKKipOYXRpb25hbCBNYXRlcmlhbHMgQ2FwYWJpbGl0aWVzKioKICAKVGhlIG92ZXJhbGwgZGF0YSBxdWFsaXR5IG9mIE5NQyBkYXRhc2V0IGlzIHZlcnkgZ29vZC4gVGhlcmUgYXJlIHJvdWdobHkgMTQsMDAwIGVudHJpZXMgYW5kIDg5JSBvZiB0aGVtIGRpZCBub3QgaGF2ZSBhbnkgbWlzc2luZyB2YWx1ZXMuIFRoZXJlIGlzIG9uZSBkYXRhIGVudHJ5IGZvciBlYWNoIGNvdW50cnkgcGVyIHllYXIuIFRoZSBhY2N1cmFjeSBvZiB0aGUgZGF0YSBpcyBhbHNvIHZlcnkgZ29vZCBiZWNhdXNlIGFzIGNvdW50cmllcyBhcmUgZGlzc29sdmVkIGFuZCBuZXcgb25lcyBhcmUgZm9ybWVkLCB0aGlzIGRhdGEga2VlcHMgdHJhY2sgb2YgdGhlbS4gRm9yIGV4YW1wbGUsIHRoZSBncmFwaCBkZXBpY3RzIHRoZSBDSU5DIG9mIEF1c3RyaWEtSHVuZ2FyeSBmcm9tIDE5MDAtMTkxOCwgdGhlIGVuZCBvZiBXV0kgd2hlbiBpdCB0aGUgQXVzdHJvLUh1bmdhcmlhbiBFbXBpcmUgd2FzIGRpc3NvbHZlZC4gSW1tZWRpYXRlbHkgYWZ0ZXIgdGhhdCwgeW91IHNlZSBkYXRhIHBvaW50cyBmb3IgQXVzdHJpYSBhbmQgSHVuZ2FyeSBzZXBhcmF0ZWx5LlRoaXMgc2FtZSBhY2N1cmFjeSBob2xkIHRydWUgZm9yIG1hbnkgZGlmZmVyZW50IGNvdXRyaWVzLCB3aGVyZSB0aGVyZSBpcyBvbmx5IGRhdGEgb25jZSB0aGUgY291bnRyeSBoYXMgZGVjbGFyZWQgaW5kZXBlbmRlbmNlIG9yIGhhcyBqdXN0IGJlZW4gY3JlYXRlZC4gCgpgYGB7ciBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9NX0KTk1DX3Rlc3QgPC0gTk1DX29yaWcKTk1DX3Rlc3QkY2luY1tOTUNfdGVzdCRjaW5jID09IC05XSA8LSBOQQpOTUNfdGVzdCRpcnN0W05NQ190ZXN0JGlyc3QgPT0gLTldIDwtIE5BCk5NQ190ZXN0JG1pbGV4W05NQ190ZXN0JG1pbGV4ID09IC05XSA8LSBOQQpOTUNfdGVzdCRtaWxwZXJbTk1DX3Rlc3QkbWlscGVyPT0gLTldIDwtIE5BCk5NQ190ZXN0JHBlY1tOTUNfdGVzdCRwZWMgPT0gLTldIDwtIE5BCk5NQ190ZXN0JHRwb3BbTk1DX3Rlc3QkdHBvcCA9PSAtOV0gPC0gTkEKTk1DX3Rlc3QkdXBvcFtOTUNfdGVzdCR1cG9wID09IC05XSA8LSBOQQoKTk1DX3Rlc3QgPC0gZmlsdGVyKE5NQ190ZXN0LCBOTUNfdGVzdCR5ZWFyICVpbiUgYygxOTAwOjIwMDcpKQp0ZXN0IDwtIGMoIkF1c3RyaWEtSHVuZ2FyeSIsICJBdXN0cmlhIiwgIkh1bmdhcnkiKQp0ZXN0X2Njb2RlIDwtIG1lbWJlcl9hbGxpYW5jZXMkY2NvZGVbbWF0Y2godGVzdCwgbWVtYmVyX2FsbGlhbmNlcyRzdGF0ZV9uYW1lKV0KCk5NQ190ZXN0IDwtIGZpbHRlcihOTUNfdGVzdCwgTk1DX3Rlc3QkY2NvZGUgJWluJSB0ZXN0X2Njb2RlKQoKZ2dwbG90KCkgKyAKICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZT0iWWVhciIpICsgCiAgc2NhbGVfeV9jb250aW51b3VzKG5hbWU9IkNJTkMiKSArCiAgbGFicyhjb2xvciA9J0NvdW50cnkgQWJicmV2aWF0aW9uJykrCiAgZ2VvbV9yZWN0KGRhdGE9ZCwgbWFwcGluZz1hZXMoeG1pbj14MSwgeG1heD14MiwgeW1pbj0wLCB5bWF4PS4wOSwgZmlsbD1Db25mbGljdCksYWxwaGE9MC4xNSkgKwogIGdlb21fbGluZShkYXRhID0gTk1DX3Rlc3QsIGFlcyh4ID0geWVhciwgeSA9IGNpbmMsIGNvbG9yID0gc3RhdGVhYmIsIGdyb3VwID0gc3RhdGVhYmIpKSArCiAgZ2d0aXRsZSgiQ0lOQyBmb3IgQXVzdHJpYS1IdW5nYXJ5IikgKyAKICB0aGVtZV9jbGFzc2ljKCkrCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoInNhbG1vbiIsICJwYWxldHVycXVvaXNlMyIsICJsaWdodHN0ZWVsYmx1ZTIiLCAibGlnaHRzdGVlbGJsdWU0IiwgImxpZ2h0c3RlZWxibHVlMyIsICJwaW5rMyIpKSsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZT0iUGFpcmVkIikrCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IC41KSwgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpIAoKYGBgCiAgCioqQWxsaWFuY2VzKioKClRoZSBvdmVyYWxsIGRhdGEgcXVhbGl0eSBvZiB0aGUgZGF0YSBzZXQgd2FzIHZlcnkgZ29vZC4gVGhlIGluZm9ybWF0aW9uIGluIHRoZSBhbGxpYW5jZXMgZGF0YSBtYXRjaGVkIGV4YWN0bHkgd2l0aCBoaXN0b3JpY2FsIGZhY3RzCgoqKkdyYXBoIG9mIE5BVE8gQWxsaWFuY2UgYW5kIHdoZW4gdGhlIG1lbWJlcnMgam9pbmVkIE1lbWJlcnMqKgoKCnZlcnNpb24gaWQgPT0gMjI3CgpTb21lIG9mIHRoZSBpbmNvbnNpc3RlbmNpZXMgdGhhdCBJIG5vdGljZWQgYXJlIGluIGNhc2VzIHdoZXJlIHRoZSBhbGxpYW5jZSBpcyBzdGlsbCBpbiBlZmZlY3QgYXMgb2YgdGhlIDEyLzMxLzIwMTIsIHdoaWNoIHdhcyB3aGVuIHRoaXMgZGF0YSBzZXQgd2FzIGxhc3QgdXBkYXRlZC4gSW4gc29tZSBvZiB0aGUgZGF0YXNldHMsIGlmIHRoZSBhbGxpYW5jZSBpcyBvbmdvaW5nLCBpdCB3b3VsZCBoYXZlIHRoZSBkeWFkX2VuZF95ZWFyLCB0aGUgZmllbGQgdGhhdCByZXByZXNlbnRzIHRoZSB5ZWFyIGluIHdoaWNoIHRoZSBhbGxpYW5jZSB3YXMgdGVybWluYXRlZCwgc2V0IHRvIDIwMTIgYW5kIGluIG90aGVyIGRhdGEgc2V0cyBpdCB3b3VsZCBoYXZlIGl0IHNldCBhcyDigJhOQeKAmS4gSW4gdGhlIGNhc2UgdGhhdCBkeWFkX2VuZF95ZWFyIGlzIHNldCB0byAyMDEyLCBpdCB3YXMgaGFyZCB0byBrbm93IGlmIHRoZXJlIHdlcmUgYW55IGFsbGlhbmNlcyB0aGF0IGVuZGVkIGluIDIwMTIgb3IgaWYgdGhleSB3ZXJlIGFuIG9uZ29pbmcgYWxsaWFuY2UuIAoKCjMpIFVTIGhhZCBvbmx5IG9uZSBhbGxpYW5jZSBiZWZvcmUgMTkyNSBhbmQgSmFwYW4gaGFzIG5vIG1vcmUgYWxsaWFuY2VzIG5vdwoKYGBge3IgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTh9CnFhIDwtIGZpbHRlcihkaXJfYWxfeWVhciwgZGlyX2FsX3llYXIkc3RhdGVfbmFtZTEgJWluJSBjKCJVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EiKSkKcWEgPC0gcWFbLCBjKDMsNSw4LDExLDE4KV0KcWEkZHlhZF9lbmRfeWVhcltxYSRkeWFkX2VuZF95ZWFyICVpbiUgTkFdID0gMjAxNgojcWEgPC0gZ2F0aGVyKHFhLCBzdF9lZCwgeWVhciwgZHlhZF9zdF95ZWFyOmR5YWRfZW5kX3llYXIgKQoKZ2dwbG90KCkgKyAKICBnZW9tX3BvaW50KGRhdGEgPXFhLCBhZXMoeD15ZWFyLCB5ID0gc3RhdGVfbmFtZTIpLCBhbHBoYSA9IC41KSArCiAgeGxhYigiWWVhciIpICsKICB5bGFiKCJDb3VudHJ5IikrCiAgZ2d0aXRsZSgiIikrCiAgdGhlbWVfY2xhc3NpYygpIAoKYGBgCiAgCiAgCioqVHJhZGUqKiAKICAgCiAgICAgCioqTWlsaXRhcml6ZWQgSW50ZXJzdGF0ZSBEaXNwdXRlcyoqIAoKCgoqQmVsb3cgZm9yIHJlZmVyZW5jZSBvbmx5IC0gdGhpcyBpcyB3aGF0IHdlIHdhbnQgdG8gdGFsayB0byBpbiB0aGlzIHNlY3Rpb24qCgoKCkNvbXBsZXRlbmVzczogSXMgYWxsIHRoZSByZXF1aXNpdGUgaW5mb3JtYXRpb24gYXZhaWxhYmxlPyBBcmUgZGF0YSB2YWx1ZXMgbWlzc2luZywgb3IgaW4gYW4gdW51c2FibGUgc3RhdGU/IEluIHNvbWUgY2FzZXMsIG1pc3NpbmcgZGF0YSBpcyBpcnJlbGV2YW50LCBidXQgd2hlbiB0aGUgaW5mb3JtYXRpb24gdGhhdCBpcyBtaXNzaW5nIGlzIGNyaXRpY2FsIHRvIGEgc3BlY2lmaWMgYnVzaW5lc3MgcHJvY2VzcywgY29tcGxldGVuZXNzIGJlY29tZXMgYW4gaXNzdWUuIAoKQ29uZm9ybWl0eTogQXJlIHRoZXJlIGV4cGVjdGF0aW9ucyB0aGF0IGRhdGEgdmFsdWVzIGNvbmZvcm0gdG8gc3BlY2lmaWVkIGZvcm1hdHM/IElmIHNvLCBkbyBhbGwgdGhlIHZhbHVlcyBjb25mb3JtIHRvIHRob3NlIGZvcm1hdHM/IE1haW50YWluaW5nIGNvbmZvcm1hbmNlIHRvIHNwZWNpZmljIGZvcm1hdHMgaXMgaW1wb3J0YW50IGluIGRhdGEgcmVwcmVzZW50YXRpb24sIHByZXNlbnRhdGlvbiwgYWdncmVnYXRlIHJlcG9ydGluZywgc2VhcmNoLCBhbmQgZXN0YWJsaXNoaW5nIGtleSByZWxhdGlvbnNoaXBzLgoKQ29uc2lzdGVuY3k6IERvIGRpc3RpbmN0IGRhdGEgaW5zdGFuY2VzIHByb3ZpZGUgY29uZmxpY3RpbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNhbWUgdW5kZXJseWluZyBkYXRhIG9iamVjdD8gQXJlIHZhbHVlcyBjb25zaXN0ZW50IGFjcm9zcyBkYXRhIHNldHM/IERvIGludGVyZGVwZW5kZW50IGF0dHJpYnV0ZXMgYWx3YXlzIGFwcHJvcHJpYXRlbHkgcmVmbGVjdCB0aGVpciBleHBlY3RlZCBjb25zaXN0ZW5jeT8gSW5jb25zaXN0ZW5jeSBiZXR3ZWVuIGRhdGEgdmFsdWVzIHBsYWd1ZXMgb3JnYW5pemF0aW9ucyBhdHRlbXB0aW5nIHRvIHJlY29uY2lsZSBiZXR3ZWVuIGRpZmZlcmVudCBzeXN0ZW1zIGFuZCBhcHBsaWNhdGlvbnMuIAoKQWNjdXJhY3k6IERvIGRhdGEgb2JqZWN0cyBhY2N1cmF0ZWx5IHJlcHJlc2VudCB0aGUg4oCccmVhbC13b3JsZOKAnSB2YWx1ZXMgdGhleSBhcmUgZXhwZWN0ZWQgdG8gbW9kZWw/IEluY29ycmVjdCBzcGVsbGluZ3Mgb2YgcHJvZHVjdCBvciBwZXJzb24gbmFtZXMsIGFkZHJlc3NlcywgYW5kIGV2ZW4gdW50aW1lbHkgb3Igbm90IGN1cnJlbnQgZGF0YSBjYW4gaW1wYWN0IG9wZXJhdGlvbmFsIGFuZCBhbmFseXRpY2FsIGFwcGxpY2F0aW9ucy4gCgpEdXBsaWNhdGlvbjogQXJlIHRoZXJlIG11bHRpcGxlLCB1bm5lY2Vzc2FyeSByZXByZXNlbnRhdGlvbnMgb2YgdGhlIHNhbWUgZGF0YSBvYmplY3RzIHdpdGhpbiB5b3VyIGRhdGEgc2V0PyBUaGUgaW5hYmlsaXR5IHRvIG1haW50YWluIGEgc2luZ2xlIHJlcHJlc2VudGF0aW9uIGZvciBlYWNoIGVudGl0eSBhY3Jvc3MgeW91ciBzeXN0ZW1zIHBvc2VzIG51bWVyb3VzIHZ1bG5lcmFiaWxpdGllcyBhbmQgcmlza3MuIAoKSW50ZWdyaXR5OiBXaGF0IGRhdGEgaXMgbWlzc2luZyBpbXBvcnRhbnQgcmVsYXRpb25zaGlwIGxpbmthZ2VzPyBUaGUgaW5hYmlsaXR5IHRvIGxpbmsgcmVsYXRlZCByZWNvcmRzIHRvZ2V0aGVyIG1heSBhY3R1YWxseSBpbnRyb2R1Y2UgZHVwbGljYXRpb24gYWNyb3NzIHlvdXIgc3lzdGVtcy4gTm90IG9ubHkgdGhhdCwgYXMgbW9yZSB2YWx1ZSBpcyBkZXJpdmVkIGZyb20gYW5hbHl6aW5nIGNvbm5lY3Rpdml0eSBhbmQgcmVsYXRpb25zaGlwcywgdGhlIGluYWJpbGl0eSB0byBsaW5rIHJlbGF0ZWQgZGF0YSBpbnN0YW5jZSB0b2dldGhlciBpbXBlZGVzIHRoaXMgdmFsdWFibGUgYW5hbHlzaXMuIAoKQmFzZWQgb24gdGhlIGRhdGEgaG93IHN0cm9uZyBhcmUgeW91ciBvYnNlcnZhdGlvbnMgICAKICAKIyMgRXhlY3V0aXZlIFN1bW1hcnkgCiAgCioqUHJvdmlkZSBhIHNob3J0IG5vbnRlY2huaWNhbCBzdW1tYXJ5IG9mIHRoZSBtb3N0IHJldmVhbGluZyBmaW5kaW5ncyBvZiB5b3VyIGFuYWx5c2lzIHdpdGggbm8gbW9yZSB0aGFuIDMgc3RhdGljIGdyYXBocyBvciBvbmUgaW50ZXJhY3RpdmUgZ3JhcGggKG9yIGxpbmspLCB3cml0dGVuIGZvciBhIG5vbnRlY2huaWNhbCBhdWRpZW5jZS4gVGhlIGxlbmd0aCBzaG91bGQgYmUgYXBwcm94aW1hdGVseSAyIHBhZ2VzIChpZiB3ZSB3ZXJlIHVzaW5nIHBhZ2VzLi4uKSBEbyBub3Qgc2hvdyBjb2RlLCBhbmQgdGFrZSBleHRyYSBjYXJlIHRvIGNsZWFuIHVwIHlvdXIgZ3JhcGhzLCBlbnN1cmluZyB0aGF0IGJlc3QgcHJhY3RpY2VzIGZvciBwcmVzZW50YXRpb24gYXJlIGZvbGxvd2VkLioqICAKCgoqKk5hdGlvbmFsIE1hdGVyaWFscyBDYXBhYmlsaXRpZXMqKgpgYGB7ciwgZWNobyA9IEZBTFNFfQpjb3VudHJpZXMgPC0gYygiR2VybWFueSIsICJKYXBhbiIsICJDaGluYSIpCmNvdW50cnlfY29kZSA8LSBtZW1iZXJfYWxsaWFuY2VzJGNjb2RlW21hdGNoKGNvdW50cmllcywgbWVtYmVyX2FsbGlhbmNlcyRzdGF0ZV9uYW1lKV0KCk5NQ19leGVjc3VtIDwtIGZpbHRlcihOTUNfb3JpZywgTk1DX29yaWckeWVhciAlaW4lIGFsbF95ZWFyKQpOTUNfZXhlY3N1bSA8LSBmaWx0ZXIoTk1DX2V4ZWNzdW0sIE5NQ19leGVjc3VtJGNjb2RlICVpbiUgY291bnRyeV9jb2RlKQpOTUNfZXhlY3N1bSRjb3VudHJ5ID0gIiIKZm9yKCBpIGluIGMoMTpsZW5ndGgoY291bnRyeV9jb2RlKSkpewogIE5NQ19leGVjc3VtJGNvdW50cnlbTk1DX2V4ZWNzdW0kY2NvZGUgPT0gY291bnRyeV9jb2RlW2ldXSA8LSBjb3VudHJpZXNbaV0KfQoKTk1DX2V4ZWNzdW1fcmF0aW9zIDwtIGZpbHRlcihOTUNfcmF0aW9zLCBOTUNfcmF0aW9zJHllYXIgJWluJSBhbGxfeWVhcikKTk1DX2V4ZWNzdW1fcmF0aW9zIDwtIGZpbHRlcihOTUNfcmF0aW9zLCBOTUNfcmF0aW9zJGNjb2RlICVpbiUgY291bnRyeV9jb2RlKQpOTUNfZXhlY3N1bV9yYXRpb3MkY291bnRyeSA9ICIiCmZvciggaSBpbiBjKDE6bGVuZ3RoKGNvdW50cnlfY29kZSkpKXsKICBOTUNfZXhlY3N1bV9yYXRpb3MkY291bnRyeVtOTUNfZXhlY3N1bV9yYXRpb3MkY2NvZGUgPT0gY291bnRyeV9jb2RlW2ldXSA8LSBjb3VudHJpZXNbaV0KfQoKCm1leF9yX2VzPC0gZ2dwbG90KCkgKyAKICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZT0iIikgKyAKICBzY2FsZV95X2NvbnRpbnVvdXMobmFtZT0iTWlsaXRhcnkgRXhwZW5kaXR1cmVzIFJhdGlvIikgKwogIGdlb21fcmVjdChkYXRhPWQsIG1hcHBpbmc9YWVzKHhtaW49eDEsIHhtYXg9eDIsIHltaW49MCwgeW1heD1tYXgoTk1DX2V4ZWNzdW1fcmF0aW9zJG1pbGV4KSwgZmlsbD1Db25mbGljdCksYWxwaGE9MC4xKSArCiAgZ2VvbV9saW5lKGRhdGEgPSBOTUNfZXhlY3N1bV9yYXRpb3MsIGFlcyh4ID0geWVhciwgeSA9IG1pbGV4LCBjb2xvciA9IGNvdW50cnksIGdyb3VwID0gY291bnRyeSkpICsKICAjZ2d0aXRsZSgiQ05JQyBieSBZZWFyIGZvciBNYWpvciBQb3dlcnMgVG9kYXkiKSArIAogIHRoZW1lX2NsYXNzaWMoKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoInNhbG1vbiIsICJwYWxldHVycXVvaXNlMyIsICJsaWdodHN0ZWVsYmx1ZTIiLCAibGlnaHRzdGVlbGJsdWU0IiwgImxpZ2h0c3RlZWxibHVlMyIsICJwaW5rMyIpKSsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gLjUpLGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpCgptaXBfcl9lczwtIGdncGxvdCgpICsgCiAgc2NhbGVfeF9jb250aW51b3VzKG5hbWU9IiIpICsgCiAgc2NhbGVfeV9jb250aW51b3VzKG5hbWU9Ik1pbGl0YXJ5IFBlcnNvbm5lbCBSYXRpbyIpICsKICBnZW9tX3JlY3QoZGF0YT1kLCBtYXBwaW5nPWFlcyh4bWluPXgxLCB4bWF4PXgyLCB5bWluPTAsIHltYXg9bWF4KE5NQ19leGVjc3VtX3JhdGlvcyRtaWxwZXIpLCBmaWxsPUNvbmZsaWN0KSxhbHBoYT0wLjEpICsKICBnZW9tX2xpbmUoZGF0YSA9IE5NQ19leGVjc3VtX3JhdGlvcywgYWVzKHggPSB5ZWFyLCB5ID0gbWlscGVyLCBjb2xvciA9IGNvdW50cnksIGdyb3VwID0gY291bnRyeSkpICsKICAjZ2d0aXRsZSgiQ05JQyBieSBZZWFyIGZvciBNYWpvciBQb3dlcnMgVG9kYXkiKSArIAogIHRoZW1lX2NsYXNzaWMoKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoInNhbG1vbiIsICJwYWxldHVycXVvaXNlMyIsICJsaWdodHN0ZWVsYmx1ZTIiLCAibGlnaHRzdGVlbGJsdWU0IiwgImxpZ2h0c3RlZWxibHVlMyIsICJwaW5rMyIpKSsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gLjUpLGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpCgoKdG9wX3JfZXM8LSBnZ3Bsb3QoKSArIAogIHNjYWxlX3hfY29udGludW91cyhuYW1lPSJZZWFyIikgKyAKICBzY2FsZV95X2NvbnRpbnVvdXMobmFtZT0iVG90YWwgUG9wdWxhdGlvbiBSYXRpbyIpICsKICBsYWJzKGNvbG9yID0nQ291bnRyeScpKwogIGdlb21fcmVjdChkYXRhPWQsIG1hcHBpbmc9YWVzKHhtaW49eDEsIHhtYXg9eDIsIHltaW49MCwgeW1heD1tYXgoTk1DX2V4ZWNzdW1fcmF0aW9zJHRwb3ApLCBmaWxsPUNvbmZsaWN0KSxhbHBoYT0wLjEpICsKICBnZW9tX2xpbmUoZGF0YSA9IE5NQ19leGVjc3VtX3JhdGlvcywgYWVzKHggPSB5ZWFyLCB5ID0gdHBvcCwgY29sb3IgPSBjb3VudHJ5LCBncm91cCA9IGNvdW50cnkpKSArCiAgI2dndGl0bGUoIkNOSUMgYnkgWWVhciBmb3IgTWFqb3IgUG93ZXJzIFRvZGF5IikgKyAKICB0aGVtZV9jbGFzc2ljKCkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCJzYWxtb24iLCAicGFsZXR1cnF1b2lzZTMiLCAibGlnaHRzdGVlbGJsdWUyIiwgImxpZ2h0c3RlZWxibHVlNCIsICJsaWdodHN0ZWVsYmx1ZTMiLCAicGluazMiKSkrCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IC41KSxsZWdlbmQucG9zaXRpb249ImJvdHRvbSIsbGVnZW5kLmtleS5zaXplID0gdW5pdCgxLCAiY20iKSwgbGVnZW5kLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTEwKSAsIGxlZ2VuZC50ZXh0PWVsZW1lbnRfdGV4dChzaXplPTEwKSkKICAKCgpnX2xlZ2VuZDwtZnVuY3Rpb24oYS5ncGxvdCl7CiAgdG1wIDwtIGdncGxvdF9ndGFibGUoZ2dwbG90X2J1aWxkKGEuZ3Bsb3QpKQogIGxlZyA8LSB3aGljaChzYXBwbHkodG1wJGdyb2JzLCBmdW5jdGlvbih4KSB4JG5hbWUpID09ICJndWlkZS1ib3giKQogIGxlZ2VuZCA8LSB0bXAkZ3JvYnNbW2xlZ11dCiAgcmV0dXJuKGxlZ2VuZCl9CgpteWxlZ2VuZDwtZ19sZWdlbmQodG9wX3JfZXMpCgoKI2dyaWRfYXJyYW5nZV9zaGFyZWRfbGVnZW5kKGlhcywgaWFzX3IsIG1leCwgbWV4X3IsIG1pcCwgbWlwX3IsIHVycCwgdXJwX3IsIHRvcCwgdG9wX3IsIG5yb3cgPSA2KQoKCmBgYAoKCgpgYGB7ciAgZmlnLndpZHRoPTE1LCBmaWcuaGVpZ2h0PTYgLCBlY2hvID0gRkFMU0V9CgpncmlkLmFycmFuZ2UoYXJyYW5nZUdyb2IobWV4X3JfZXMsbWlwX3JfZXMgKyB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gLjUpLCBsZWdlbmQucG9zaXRpb249Im5vbmUiKSxucm93PTEsIG5jb2wgPTIpLG15bGVnZW5kLCBoZWlnaHRzPWMoMTAsMSkpCgpgYGAKCioqQWxsaWFuY2VzKioKICAKICAKKipUcmFkZSoqIAogICAKICAgICAKKipNaWxpdGFyaXplZCBJbnRlcnN0YXRlIERpc3B1dGVzKiogCiAgCiAgCiMjIE1haW4gQW5hbHlzaXMgCgoqKlByb3ZpZGUgYSBkZXRhaWxlZCwgd2VsbC1vcmdhbml6ZWQgZGVzY3JpcHRpb24gb2YgeW91ciBmaW5kaW5ncywgaW5jbHVkaW5nIHRleHR1YWwgZGVzY3JpcHRpb24sIGdyYXBocywgYW5kIGNvZGUuICBZb3VyIGZvY3VzIHNob3VsZCBiZSBvbiBib3RoIHRoZSByZXN1bHRzIGFuZCB0aGUgcHJvY2Vzcy4gSW5jbHVkZSwgYXMgcmVhc29uYWJsZSBhbmQgcmVsZXZhbnQsIGFwcHJvYWNoZXMgdGhhdCBkaWRuJ3Qgd29yaywgY2hhbGxlbmdlcywgdGhlIGRhdGEgY2xlYW5pbmcgcHJvY2VzcywgZXRjLioqCgojIyMjTmF0aW9uYWwgTWF0ZXJpYWxzIENhcGFiaWxpdGllcwoKYGBge3J9Ck5NQyA8LSBOTUNfb3JpZyAKTk1DJGNpbmNbTk1DJGNpbmMgPT0gLTl8IGlzLm5hKE5NQyRjaW5jKV0gPC0gMApOTUMkaXJzdFtOTUMkaXJzdCA9PSAtOXwgaXMubmEoTk1DJGlyc3QpXSA8LSAwCk5NQyRtaWxleFtOTUMkbWlsZXggPT0gLTl8IGlzLm5hKE5NQyRtaWxleCldIDwtIDAKTk1DJG1pbHBlcltOTUMkbWlscGVyPT0gLTl8IGlzLm5hKE5NQyRtaWxwZXIpXSA8LSAwCk5NQyRwZWNbTk1DJHBlYyA9PSAtOXwgaXMubmEoTk1DJHBlYyldIDwtIDAKTk1DJHRwb3BbTk1DJHRwb3AgPT0gLTl8IGlzLm5hKE5NQyR0cG9wKV0gPC0gMApOTUMkdXBvcFtOTUMkdXBvcCA9PSAtOXwgaXMubmEoTk1DJHVwb3ApXSA8LSAwCgphbGxfeWVhciA8LSBjKDE5MDA6MjAwNykKCk5NQ19yYXRpb3MgPC0gYygiIikKZm9yICh5ZWFyX3QgaW4gYWxsX3llYXIpewogIHlyIDwtIGZpbHRlcihOTUMsIE5NQyR5ZWFyICVpbiUgeWVhcl90KSAKICBtYXggPC0gYXBwbHkoeXJbLCBjKDQ6OSldLCAyLCBzdW0pCiAgI21heCA8LSBhcy5udW1lcmljKG1heFs0OjldKQogIGZvciAoaSBpbiA0OjkpewogICAgeXJbLGldID0gYXMubnVtZXJpYyh5clssaV0vbWF4W2ktM10pCiAgfQogIE5NQ19yYXRpb3MgPC0gc21hcnRiaW5kKE5NQ19yYXRpb3MgLCB5cikKfQoKTk1DX3JhdGlvcyAgPC0gTk1DX3JhdGlvcyBbYygyOm5yb3coTk1DX3JhdGlvcyApKSwgYygyOmxlbmd0aChOTUNfcmF0aW9zKSldCgoKY2JiUGFsZXR0ZSA8LSBjKCIjMDAwMDAwIiwgIiNFNjlGMDAiLCAiIzU2QjRFOSIsICIjMDA5RTczIiwgIiNGMEU0NDIiLCAiIzAwNzJCMiIsICIjRDU1RTAwIiwgIiNDQzc5QTciKQoKYGBgCgoKTmF0aW9uYWwgTWF0ZXJpYWxzIENhcGFiaWxpdHkgbWVhc3VyZXMgdGhlIHBvd2VyIG9mIGEgY291bnRyeSBiYXNlZCBvbiA2IHZhbHVlczogdG90YWwgcG9wdWxhdGlvbiwgdXJiYW4gcG9wdWxhdGlvbiwgbWlsaXRhcnkgcGVyc29ubmVsLCBtaWxpdGFyeSBleHBlbmRpdHVyZXMsIGlyb24gYW5kIHN0ZWVsIHByb2R1Y3Rpb24gYW5kIGVuZXJneSBjb25zdW1wdGlvbi4gTk1DIGlzIHB1cmVseSBhIG1lYXN1cmUgb2YgbWlsaXRhcnkgYW5kIGVjb25vbWljIG1lYW5zIG9mIGluZmx1ZW5jZSByYXRoZXIgdGhhbiBkaXBsb21hY3kgb3Igb3RoZXIgZm9ybXMgb2YgaW5mbHVlbmNlLiAKCkNJTkMgaXMgdGhlIGNvbXBvc2l0ZSBzY29yZSB0byBtZWFzdXJlIHRoZSBwb3dlciBvZiBhIGNvdW50cnkgdXNpbmcgdGhlIGF2ZXJhZ2Ugb2YgdGhlIHJhdGlvcywgY2FsY3VsYXRlZCBhcyBkZXNjcmliZWQgYmVsb3cuIAogCiFbXSAoLi9jaW5jX2NhbGMucG5nKQoKCkJlbG93IGlzIHRoZSBDTklDIHNjb3JlIGZvciBtYWpvciBwb3dlcnMgdG9kYXkgd2hvIGFsc28gcGFydGljaXBhdGVkIHRoZSBtYWpvciB3YXJzIGluIHRoZSBwYXN0LiBBbHNvIGhpZ2hsaWdodGVkIGFyZSB0aGUgeWVhcnMgd2FycyBtZW50aW9uZWQgYWJvdmUuIAoKCgojYGBge3IgZmlnLndpZHRoPTUsIGZpZy5oZWlnaHQ9Mi41fQpgYGB7ciBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9NX0KY291bnRyaWVzIDwtIGMoIlVuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYSIsICJVbml0ZWQgS2luZ2RvbSIsICJGcmFuY2UiLCAiUnVzc2lhIiwiR2VybWFueSIsICJKYXBhbiIsICJDaGluYSIpCmNvdW50cnlfY29kZSA8LSBtZW1iZXJfYWxsaWFuY2VzJGNjb2RlW21hdGNoKGNvdW50cmllcywgbWVtYmVyX2FsbGlhbmNlcyRzdGF0ZV9uYW1lKV0KCk5NQ19tcCA8LSBmaWx0ZXIoTk1DLCBOTUMkeWVhciAlaW4lIGFsbF95ZWFyKQpOTUNfbXAgPC0gZmlsdGVyKE5NQ19tcCwgTk1DX21wJGNjb2RlICVpbiUgY291bnRyeV9jb2RlKQpOTUNfbXAkY291bnRyeSA9ICIiCmZvciggaSBpbiBjKDE6bGVuZ3RoKGNvdW50cnlfY29kZSkpKXsKICBOTUNfbXAkY291bnRyeVtOTUNfbXAkY2NvZGUgPT0gY291bnRyeV9jb2RlW2ldXSA8LSBjb3VudHJpZXNbaV0KfQoKZ2dwbG90KCkgKyAKICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZT0iWWVhciIpICsgCiAgc2NhbGVfeV9jb250aW51b3VzKG5hbWU9IkNJTkMiKSArCiAgbGFicyhjb2xvciA9J0NvdW50cnknKSsKICBnZW9tX3JlY3QoZGF0YT1kLCBtYXBwaW5nPWFlcyh4bWluPXgxLCB4bWF4PXgyLCB5bWluPTAsIHltYXg9bWF4KE5NQ19tcCRjaW5jKSwgZmlsbD1Db25mbGljdCksYWxwaGE9MC4xNSkgKwogIGdlb21fbGluZShkYXRhID0gTk1DX21wLCBhZXMoeCA9IHllYXIsIHkgPSBjaW5jLCBjb2xvciA9IGNvdW50cnksIGdyb3VwID0gc3RhdGVhYmIpKSArCiAgZ2d0aXRsZSgiQ05JQyBieSBZZWFyIGZvciBNYWpvciBQb3dlcnMgVG9kYXkiKSArIAogIHRoZW1lX2NsYXNzaWMoKSsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9Yygic2FsbW9uIiwgInBhbGV0dXJxdW9pc2UzIiwgImxpZ2h0c3RlZWxibHVlMiIsICJsaWdodHN0ZWVsYmx1ZTQiLCAibGlnaHRzdGVlbGJsdWUzIiwgInBpbmszIikpKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlPSJQYWlyZWQiKSsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gLjUpLCBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikgCiAgCgoKCmBgYAoKCkFzIHlvdSBjYW4gc2VlIENOSUMgaXMgY29uc3RhbnRseSBjaGFuZ2luZy4gSW50ZXJlc3RpbmdseSwgdGhlIENOSUMgc3Bpa2VzIGZvciB0aGUgVVMgcmlnaHQgYWZ0ZXIgV1dJIGFuZCBXV0lJIHdoZXJlIHRoZSBVUyBoYWQgYSBtYWpvciByb2xlIGluIHRoZSBvdXRjb21lIG9mIHRoZSB3YXJzLiBUaGVyZSBpcyBhbHNvIGFuIGluY3JlYXNlIGluIHRoZSBVU+KAmXMgQ0lOQyBzY29yZSBkdXJpbmcgdGhlIEtvcmVhbiBXYXIuIEZvbGxvd2luZyB0aGUgS29yZWFuIFdhciwgdGhlIFVT4oCZcyBDSU5DIHNjb3JlIHNob3dzIGEgY29udGludW91cyBkZWNyZWFzZSBkdXJpbmcgdGhlIFZpZXRuYW0gd2hlcmUgdGhlIFVTIGxvc3QgdGhlIHdhci4gIEF0IHRoZSBlbmQgb2YgV1dJLCB5b3Ugc2VlIFJ1c3NpYeKAmXMgQ05JQyBkaXAgbG93IGJ1dCBpdCBib3VuY2VkIGJhY2sgdG8gaXRzIENOSUMgYmVmb3JlIFdXSSBwcmV0dHkgcXVpY2tseS4gRHVyaW5nIHRoZSBWaWV0bmFtIFdhciwgUnVzc2lhIHN1cHBvcnRlZCB0aGUgVmlldG5hbWVzZSBwZW9wbGUgYW5kIHlvdSBzZWUgdGhlIGl0cyBDSU5DIHNjb3JlIGluY3JlYXNlIGFib3ZlIHRoYXQgb2YgdGhlIFVTIGFzIHRoZXkgc3RhcnQgdG8gZ2FpbiBncm91bmQgaW4gdGhlIHdhci4gQWxzbyBSdXNzaWHigJlzIENJTkMgc2NvcmUgZHJvcHMgbG93IHRvd2FyZHMgdGhlIGVuZCBvZiB0aGUgQ29sZCBXYXIgYXMgdGhlIHNhdGVsbGl0ZSBzdGF0ZXMgc3RhcnQgZ2FpbmluZyB0aGVpciBpbmRlcGVuZGVuY2UgYW5kIHRoZSBVU1NSIHdhcyBkaXNzb2x2ZWQuCgpUbyBleHBsb3JlIHRoZSB0cmVuZHMgbW9yZSwgdGhlIGRhdGEgd2FzIHJlZmluZWQgdG8gb25seSBsb29rIGF0IHRoZSBtYWpvciBwYXJ0aWNpcGFudHMgb2YgZWFjaCB3YXIuIEZvciBleGFtcGxlLCB3aXRoIFdXSSB3ZSBsb29rZWQgYXQgdGhlIENJTkMgdmFsdWVzIGZvciBtYWpvciBwbGF5ZXJzIGluIHRoZSBBbGxpZWQgUG93ZXJzIGFuZCBDZW50cmFsIFBvd2VycyBhIGZldyB5ZWFycyBiZWZvcmUgYW5kIGFmdGVyIHRoZSB3YXIuIFdlIHJlcGxpY2F0ZWQgdGhpcyBwcm9jZXNzIGZvciBhbGwgdGhlIGV2ZW50cyBsaXN0ZWQgYWJvdmUuIEJlbG93IGFyZSBDSU5DIGdyYXBocyB1c2luZyB0aGlzIGFwcHJvYWNoIGZvciBXV0kgYW5kIFdXSUkuCgoKYGBge3IgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTUsIEVjaG8gPSBUUlVFfQphbGxpZWQgPC0gYygiVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhIiwgIlVuaXRlZCBLaW5nZG9tIiwgIlJ1c3NpYSIsICJKYXBhbiIsICJJdGFseSIpCmFsbGllZF9jY29kZSA8LSBtZW1iZXJfYWxsaWFuY2VzJGNjb2RlW21hdGNoKGFsbGllZCwgbWVtYmVyX2FsbGlhbmNlcyRzdGF0ZV9uYW1lKV0KCmNlbnRyYWwgPC0gYygiR2VybWFueSIsICJUdXJrZXkiLCAiQXVzdHJpYS1IdW5nYXJ5IiwgIlJvbWFuaWEiLCAiQnVsZ2FyaWEiKQpjZW50cmFsX2Njb2RlIDwtIG1lbWJlcl9hbGxpYW5jZXMkY2NvZGVbbWF0Y2goY2VudHJhbCwgbWVtYmVyX2FsbGlhbmNlcyRzdGF0ZV9uYW1lKV0KCldXSV9yYW5nZSA9IGMoMTkwNDoxOTMwKQoKV1dJPC0gZmlsdGVyKE5NQywgTk1DJHllYXIgJWluJSBXV0lfcmFuZ2UpCmFsbGllZFA8LSBmaWx0ZXIoV1dJLCBXV0kkY2NvZGUgJWluJSBhbGxpZWRfY2NvZGUpCmFsbGllZFAkc2lkZSA9ICJBbGxpZWQgUG93ZXJzIgpmb3IoIGkgaW4gYygxOmxlbmd0aChhbGxpZWRfY2NvZGUpKSl7CiAgYWxsaWVkUCRjb3VudHJ5W2FsbGllZFAkY2NvZGUgPT0gYWxsaWVkX2Njb2RlW2ldXSA8LSBwYXN0ZShhbGxpZWRbaV0sIihBbGxpZWQpIiwgc2VwID0gIiAiKQp9CgpjZW50cmFsUDwtIGZpbHRlcihXV0ksIFdXSSRjY29kZSAlaW4lIGNlbnRyYWxfY2NvZGUpCmNlbnRyYWxQJHNpZGUgPSAiQ2VudHJhbCBQb3dlcnMgIgpmb3IoIGkgaW4gYygxOmxlbmd0aChjZW50cmFsX2Njb2RlKSkpewogIGNlbnRyYWxQJGNvdW50cnlbY2VudHJhbFAkY2NvZGUgPT0gY2VudHJhbF9jY29kZVtpXV0gPC0gcGFzdGUoY2VudHJhbFtpXSwgIihDZW50cmFsKSIsIHNlcCA9ICIgIikKfQpXV0kgPC1yYmluZChhbGxpZWRQLCBjZW50cmFsUCkKCnd3MSA8LSBnZ3Bsb3QoKSArIAogIGxhYnMoY29sb3IgPSdDb3VudHJ5JykrCiAgeGxhYigiWWVhciIpICsKICB5bGFiKCJDTklDIikrCiAgZ2VvbV9yZWN0KGRhdGE9ZCwgbWFwcGluZz1hZXMoeG1pbj0xOTE0LCB4bWF4PTE5MTgsIHltaW49MCwgeW1heD0uNCksYWxwaGE9MC4wNSwgZmlsbCA9InNhbG1vbiIpICsKICBnZW9tX2xpbmUoZGF0YSA9IFdXSSwgYWVzKHggPSB5ZWFyLCB5ID0gY2luYywgY29sb3IgPSBjb3VudHJ5LCBncm91cCA9IGNvdW50cnkpKSArIAogIGZhY2V0X3dyYXAofnNpZGUpICsgCiAgdGhlbWVfY2xhc3NpYygpKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlPSJQYWlyZWQiKSsKICBnZ3RpdGxlKCJDTklDIFNjb3JlOiBXV0kgTWFqb3IgUGxheWVycyAiKSsKICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IC41KSxsZWdlbmQucG9zaXRpb249InJpZ2h0IikKCgphbGxpZXMgPC0gYygiVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhIiwgIlVuaXRlZCBLaW5nZG9tIiwgIkZyYW5jZSIsICJSdXNzaWEiLCAiQXVzdHJhbGlhIiwiQ2hpbmEiKQphbGxpZXNfY2NvZGUgPC0gbWVtYmVyX2FsbGlhbmNlcyRjY29kZVttYXRjaChhbGxpZXMsIG1lbWJlcl9hbGxpYW5jZXMkc3RhdGVfbmFtZSldCgpheGlzIDwtIGMoIkdlcm1hbnkiLCAiSXRhbHkiLCAiSmFwYW4iLCAiSHVuZ2FyeSIsICJSb21hbmlhIiwgIkJ1bGdhcmlhIikKYXhpc19jY29kZSA8LSBtZW1iZXJfYWxsaWFuY2VzJGNjb2RlW21hdGNoKGF4aXMsIG1lbWJlcl9hbGxpYW5jZXMkc3RhdGVfbmFtZSldCgpXV0lJX3JhbmdlID0gYygxOTM0OjE5NTApCgpXV0lJPC0gZmlsdGVyKE5NQywgTk1DJHllYXIgJWluJSBXV0lJX3JhbmdlKQphbGxpZWRQMjwtIGZpbHRlcihXV0lJLCBXV0lJJGNjb2RlICVpbiUgYWxsaWVzX2Njb2RlKQphbGxpZWRQMiRzaWRlID0gIkFsbGllcyIKZm9yKCBpIGluIGMoMTpsZW5ndGgoYWxsaWVzX2Njb2RlKSkpewogIGFsbGllZFAyJGNvdW50cnlbYWxsaWVkUDIkY2NvZGUgPT0gYWxsaWVzX2Njb2RlW2ldXSA8LSBwYXN0ZShhbGxpZXNbaV0sICIoQWxsaWVzKSIsIHNlcCA9ICIgIikKfQoKYXhpc1A8LSBmaWx0ZXIoV1dJSSwgV1dJSSRjY29kZSAlaW4lIGF4aXNfY2NvZGUpCmF4aXNQJHNpZGUgPSAiQXhpcyIKZm9yKCBpIGluIGMoMTpsZW5ndGgoYXhpc19jY29kZSkpKXsKICBheGlzUCRjb3VudHJ5W2F4aXNQJGNjb2RlID09IGF4aXNfY2NvZGVbaV1dIDwtIHBhc3RlKGF4aXNbaV0sICIoQXhpcykiLCBzZXAgPSAiICIpCn0KCldXSUkgPC1yYmluZChhbGxpZWRQMiwgYXhpc1ApCgp3dzIgPC0gZ2dwbG90KCkgKyAKICBsYWJzKGNvbG9yID0nQ291bnRyeScpKwogIHhsYWIoIlllYXIiKSArCiAgeWxhYigiQ05JQyIpKwogIGdlb21fcmVjdChkYXRhPWQsIG1hcHBpbmc9YWVzKHhtaW49MTkzOSwgeG1heD0xOTQ1LCB5bWluPTAsIHltYXg9LjQpLGFscGhhPTAuMDUsIGZpbGwgPSJwYWxldHVycXVvaXNlMyIpICsKICBnZW9tX2xpbmUoZGF0YSA9IFdXSUksIGFlcyh4ID0geWVhciwgeSA9IGNpbmMsIGNvbG9yID0gY291bnRyeSwgZ3JvdXAgPSBzdGF0ZWFiYikpICsgCiAgZmFjZXRfd3JhcCh+c2lkZSkgKyAKICB0aGVtZV9jbGFzc2ljKCkrCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGU9IlBhaXJlZCIpKwogIGdndGl0bGUoIkNOSUMgU2NvcmU6IFdXSUkgTWFqb3IgUGxheWVycyAiKSsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gLjUpLGxlZ2VuZC5wb3NpdGlvbj0icmlnaHQiKQoKYGBgCgojYGBge3IgZmlnLndpZHRoPTUsIGZpZy5oZWlnaHQ9NH0KYGBge3IgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTh9CmdyaWQuYXJyYW5nZSh3dzEsIHd3MiwgbnJvdz0yKQoKYGBgCkFzIG1lbnRpb25lZCwgd2l0aCBXV0kgdGhlIFVT4oCZcyBDSU5DIHNwaWtlZCByaWdodCBhZnRlciB0aGUgd2FyIGFuZCB0aGVuIGJlZ2FuIHRvIHN0ZWFkaWx5IGRlY3JlYXNlIHRpbGwgdGhlIGJlZ2lubmluZyBvZiB0aGUgV1dJSS4gUnVzc2lh4oCZcyBDSU5DIGRyb3BwZWQgYnV0IHJvc2UgYWdhaW4gcHJldHR5IHF1aWNrbHkgYW5kIHN0YXllZCBvbiBhIHJlbGF0aXZlbHkgdXB3YXJkIHRyZW5kIHRpbGwgV1dJSS4gVW5saWtlIHRoZSBVUyBhbmQgUnVzc2lhLCBVbml0ZWQgS2luZ2RvbeKAmXMgQ0lOQyB3YXMgc3RlYWRpbHkgZGVjcmVhc2luZyBhZnRlciB0aGUgd2FyLiBJdGFseSBhbmQgSmFwYW7igJlzIENJTkMgcmVtYWluZWQgc3RlYWR5LiBXaXRoIHRoZSBDZW50cmFsIFBvd2VycyBhZnRlciBXV0ksIEdlcm1hbnnigJlzIENJTkMgZHJvcHBlZCBidXQgaXQgZGlkIG5vdCByaXNlIGFnYWluLiBUdXJrZXnigJlzLCBSb21hbmlh4oCZcyBhbmQgQnVsZ2FyaWHigJlzIENJTkMgcmVtYWluZWQgc3RlYWR5LiBXZSBzZWUgdGhlIEF1c3RyaWEtSHVuZ2FyaWFuIENJTkMgZGlzYXBwZWFyIGFmdGVyIHRoZSB3YXIgc2luY2UgdGhlIEF1c3Ryby1IdW5nYXJpYW4gZW1waXJlIHdhcyBkaXNzb2x2ZWQgYXQgdGhlIGVuZCBvZiB0aGUgd2FyLgoKV2l0aCBXV0lJLCB3ZSBzZWUgYSBzaW1pbGFyIHBhdHRlcm4gZm9yIHRoZSBVUyB3aGVyZSB0aGUgQ05JQyByZWFjaGVzIGEgcGVhayBhdCB0aGUgZW5kIG9mIFdXSUkgYW5kIHN0ZWFkaWx5IGRlY3JlYXNlcyB0aWxsIHRoZSBLb3JlYW4gd2FyLiBSdXNzaWEgYWxzbyBzaG93cyBhIHNpbWlsYXIgcGF0dGVybiB0byBXV0kgd2hlcmUgaXRzIENJTkMgc2NvcmUgcmVhY2hlcyBhIGxvdyBwb2ludCB0b3dhcmRzIHRoZSBlbmQgb2YgV1dJSSBhbmQgdGhlbiBjb250aW51ZXMgdG8gc3RlYWRpbHkgaW5jcmVhc2UgdGlsbCB0aGUgS29yZWFuIHdhci4gVGhlIFVLIGFsc28gZm9sbG93cyBhIHNpbWlsYXIgcGF0dGVybiB3aGVyZSBpdCBDSU5DIHBlYWtzIHJpZ2h0IGFmdGVyIHRoZSB3YXIgYW5kIHRoZW4gc3RlYWRpbHkgZGVjcmVhc2VzIHRocm91Z2hvdXQgdGhlIENvbGQgV2FyIHRpbWUgcGVyaW9kLiBXaXRoIHRoZSBBeGlzIHBvd2VycywgR2VybWFueeKAmXMgYW5kIEphcGFu4oCZcyBDSU5DIGRyb3BzIG9mZi4KClRvIGV4cGxvcmUgdGhlIHBhdHRlcnMgYWJvdmUsIHdlIGxvb2tlZCBpbnRvIHRoZSBjb21wb25lbnRzIHRoYXQgbWFrZSB1cCB0aGUgQ0lOQy4gV2UgY2hvc2UgdG8gZm9jdXMgb24gdGhlIG1ham9yIHBvd2VycyBiZWNhdXNlIHRoZXkgaGFkIHRoZSBtb3N0IGRyYXN0aWMgY2hhbmdlcyBkdXJpbmcgdGhpcyB0aW1lIHBlcmlvZC4gV2UgbG9va2VkIGF0IGJvdGggdGhlIGFjdHVhbCB2YWx1ZSBhbmQgdGhlIHJhdGlvIGJlY2F1c2UgdGhlIGFic29sdXRlIHZhbHVlcyBncmFkdWFsbHkgaW5jcmVhc2VkIG92ZXIgdGltZSBidXQgdGhlIHJhdGlvcyBzaG93IHBlcmZvcm1hbmNlIHJlbGF0aXZlIHRvIHRoZSBvdGhlciBjb3VudHJpZXMgZWFjaCB5ZWFyLiBMb29raW5nIGF0IHRoZSByYXRpb3MgaGVscGVkIHVzIHRvIHNlZSB0cmVuZHMgdGhhdCB3ZXJlIG5vdCBlYXN5IHRvIHNwb3Qgd2hlbiBsb29raW5nIGF0IHRoZSBvdmVyYWxsIHZhbHVlcy4gQmVsb3cgaXMgYSBwbG90IG9mIGZpdmUgb2YgdGhlIHNpeCBDSU5DIGNvbXBvbmVudHMsIHRoZSB2YWx1ZXMgYW5kIHRoZSByYXRpb3MKCgoKCmBgYHtyIGZpZy53aWR0aD0yNSwgZmlnLmhlaWdodD0yMCAsIGVjaG89RkFMU0V9CgptZXggPC0gZ2dwbG90KCkgKyAKICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZT0iWWVhciIpICsgCiAgc2NhbGVfeV9jb250aW51b3VzKG5hbWU9Ik1pbGl0YXJ5IEV4cGVuZGl0dXJlcyIpICsKICBnZW9tX3JlY3QoZGF0YT1kLCBtYXBwaW5nPWFlcyh4bWluPXgxLCB4bWF4PXgyLCB5bWluPTAsIHltYXg9bWF4KE5NQ19tcCRtaWxleCksIGZpbGw9Q29uZmxpY3QpLGFscGhhPTAuMSkgKwogIGdlb21fbGluZShkYXRhID0gTk1DX21wLCBhZXMoeCA9IHllYXIsIHkgPSBtaWxleCwgY29sb3IgPSBjb3VudHJ5LCBncm91cCA9IGNvdW50cnkpKSArCiAgI2dndGl0bGUoIkNOSUMgYnkgWWVhciBmb3IgTWFqb3IgUG93ZXJzIFRvZGF5IikgKyAKICB0aGVtZV9jbGFzc2ljKCkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCJzYWxtb24iLCAicGFsZXR1cnF1b2lzZTMiLCAibGlnaHRzdGVlbGJsdWUyIiwgImxpZ2h0c3RlZWxibHVlNCIsICJsaWdodHN0ZWVsYmx1ZTMiLCAicGluazMiKSkrCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGU9IlBhaXJlZCIpKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAuNSksbGVnZW5kLnBvc2l0aW9uPSJub25lIikKCgptaXA8LSBnZ3Bsb3QoKSArIAogIHNjYWxlX3hfY29udGludW91cyhuYW1lPSJZZWFyIikgKyAKICBzY2FsZV95X2NvbnRpbnVvdXMobmFtZT0iTWlsaXRhcnkgUGVyc29ubmVsICIpICsKICBnZW9tX3JlY3QoZGF0YT1kLCBtYXBwaW5nPWFlcyh4bWluPXgxLCB4bWF4PXgyLCB5bWluPTAsIHltYXg9bWF4KE5NQ19tcCRtaWxwZXIpLCBmaWxsPUNvbmZsaWN0KSxhbHBoYT0wLjEpICsKICBnZW9tX2xpbmUoZGF0YSA9IE5NQ19tcCwgYWVzKHggPSB5ZWFyLCB5ID0gbWlscGVyLCBjb2xvciA9IGNvdW50cnksIGdyb3VwID0gY291bnRyeSkpICsKICAjZ2d0aXRsZSgiQ05JQyBieSBZZWFyIGZvciBNYWpvciBQb3dlcnMgVG9kYXkiKSArIAogIHRoZW1lX2NsYXNzaWMoKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoInNhbG1vbiIsICJwYWxldHVycXVvaXNlMyIsICJsaWdodHN0ZWVsYmx1ZTIiLCAibGlnaHRzdGVlbGJsdWU0IiwgImxpZ2h0c3RlZWxibHVlMyIsICJwaW5rMyIpKSsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZT0iUGFpcmVkIikrCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IC41KSxsZWdlbmQucG9zaXRpb249Im5vbmUiKQoKCm5yZzwtIGdncGxvdCgpICsgCiAgc2NhbGVfeF9jb250aW51b3VzKG5hbWU9IlllYXIiKSArIAogIHNjYWxlX3lfY29udGludW91cyhuYW1lPSJQcmltYXJ5IEVuZXJneSBDb25zdW1wdGlvbiIpICsKICBnZW9tX3JlY3QoZGF0YT1kLCBtYXBwaW5nPWFlcyh4bWluPXgxLCB4bWF4PXgyLCB5bWluPTAsIHltYXg9bWF4KE5NQ19tcCRwZWMpLCBmaWxsPUNvbmZsaWN0KSxhbHBoYT0wLjEpICsKICBnZW9tX2xpbmUoZGF0YSA9IE5NQ19tcCwgYWVzKHggPSB5ZWFyLCB5ID0gcGVjLCBjb2xvciA9IGNvdW50cnksIGdyb3VwID0gY291bnRyeSkpICsKICAjZ2d0aXRsZSgiQ05JQyBieSBZZWFyIGZvciBNYWpvciBQb3dlcnMgVG9kYXkiKSArIAogIHRoZW1lX2NsYXNzaWMoKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoInNhbG1vbiIsICJwYWxldHVycXVvaXNlMyIsICJsaWdodHN0ZWVsYmx1ZTIiLCAibGlnaHRzdGVlbGJsdWU0IiwgImxpZ2h0c3RlZWxibHVlMyIsICJwaW5rMyIpKSsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZT0iUGFpcmVkIikrCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IC41KSxsZWdlbmQucG9zaXRpb249Im5vbmUiKQoKCmlhczwtZ2dwbG90KCkgKyAKICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZT0iWWVhciIpICsgCiAgc2NhbGVfeV9jb250aW51b3VzKG5hbWU9Iklyb24gYW5kIFN0ZWVsIFByb2R1Y3Rpb24iKSArCiAgZ2VvbV9yZWN0KGRhdGE9ZCwgbWFwcGluZz1hZXMoeG1pbj14MSwgeG1heD14MiwgeW1pbj0wLCB5bWF4PW1heChOTUNfbXAkaXJzdCksIGZpbGw9Q29uZmxpY3QpLGFscGhhPTAuMSkgKwogIGdlb21fbGluZShkYXRhID0gTk1DX21wLCBhZXMoeCA9IHllYXIsIHkgPSBpcnN0LCBjb2xvciA9IGNvdW50cnksIGdyb3VwID0gY291bnRyeSkpICsKICAjZ2d0aXRsZSgiQ05JQyBieSBZZWFyIGZvciBNYWpvciBQb3dlcnMgVG9kYXkiKSArIAogIHRoZW1lX2NsYXNzaWMoKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoInNhbG1vbiIsICJwYWxldHVycXVvaXNlMyIsICJsaWdodHN0ZWVsYmx1ZTIiLCAibGlnaHRzdGVlbGJsdWU0IiwgImxpZ2h0c3RlZWxibHVlMyIsICJwaW5rMyIpKSsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZT0iUGFpcmVkIikrCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IC41KSxsZWdlbmQucG9zaXRpb249Im5vbmUiKQoKCnVycDwtIGdncGxvdCgpICsgCiAgc2NhbGVfeF9jb250aW51b3VzKG5hbWU9IlllYXIiKSArIAogIHNjYWxlX3lfY29udGludW91cyhuYW1lPSJVcmJhbiBQb3B1bGF0aW9uIikgKwogIGdlb21fcmVjdChkYXRhPWQsIG1hcHBpbmc9YWVzKHhtaW49eDEsIHhtYXg9eDIsIHltaW49MCwgeW1heD1tYXgoTk1DX21wJHVwb3ApLCBmaWxsPUNvbmZsaWN0KSxhbHBoYT0wLjEpICsKICBnZW9tX2xpbmUoZGF0YSA9IE5NQ19tcCwgYWVzKHggPSB5ZWFyLCB5ID0gdXBvcCwgY29sb3IgPSBjb3VudHJ5LCBncm91cCA9IGNvdW50cnkpKSArCiAgI2dndGl0bGUoIkNOSUMgYnkgWWVhciBmb3IgTWFqb3IgUG93ZXJzIFRvZGF5IikgKyAKICB0aGVtZV9jbGFzc2ljKCkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCJzYWxtb24iLCAicGFsZXR1cnF1b2lzZTMiLCAibGlnaHRzdGVlbGJsdWUyIiwgImxpZ2h0c3RlZWxibHVlNCIsICJsaWdodHN0ZWVsYmx1ZTMiLCAicGluazMiKSkrCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGU9IlBhaXJlZCIpKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAuNSksbGVnZW5kLnBvc2l0aW9uPSJub25lIikKCnRvcDwtZ2dwbG90KCkgKyAKICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZT0iWWVhciIpICsgCiAgc2NhbGVfeV9jb250aW51b3VzKG5hbWU9IlRvdGFsIFBvcHVsYXRpb24iKSArCiAgZ2VvbV9yZWN0KGRhdGE9ZCwgbWFwcGluZz1hZXMoeG1pbj14MSwgeG1heD14MiwgeW1pbj0wLCB5bWF4PW1heChOTUNfbXAkdHBvcCksIGZpbGw9Q29uZmxpY3QpLGFscGhhPTAuMTUpICsKICBnZW9tX2xpbmUoZGF0YSA9IE5NQ19tcCwgYWVzKHggPSB5ZWFyLCB5ID0gdHBvcCwgY29sb3IgPSBjb3VudHJ5LCBncm91cCA9IGNvdW50cnkpKSArCiAgI2dndGl0bGUoIkNOSUMgYnkgWWVhciBmb3IgTWFqb3IgUG93ZXJzIFRvZGF5IikgKyAKICB0aGVtZV9jbGFzc2ljKCkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCJzYWxtb24iLCAicGFsZXR1cnF1b2lzZTMiLCAibGlnaHRzdGVlbGJsdWUyIiwgImxpZ2h0c3RlZWxibHVlNCIsICJsaWdodHN0ZWVsYmx1ZTMiLCAicGluazMiKSkrCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGU9IlBhaXJlZCIpKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAuNSksbGVnZW5kLnBvc2l0aW9uPSJub25lIikKCgojZ3JpZC5hcnJhbmdlKGlhcywgbWV4LCBtaXAsIG5yZywgdXJwLCB0b3AsIG5yb3cgPSAzKQoKCk5NQ19tcF9yYXRpb3MgPC0gZmlsdGVyKE5NQ19yYXRpb3MsIE5NQ19yYXRpb3MkeWVhciAlaW4lIGFsbF95ZWFyKQpOTUNfbXBfcmF0aW9zIDwtIGZpbHRlcihOTUNfcmF0aW9zLCBOTUNfcmF0aW9zJGNjb2RlICVpbiUgY291bnRyeV9jb2RlKQpOTUNfbXBfcmF0aW9zJGNvdW50cnkgPSAiIgpmb3IoIGkgaW4gYygxOmxlbmd0aChjb3VudHJ5X2NvZGUpKSl7CiAgTk1DX21wX3JhdGlvcyRjb3VudHJ5W05NQ19tcF9yYXRpb3MkY2NvZGUgPT0gY291bnRyeV9jb2RlW2ldXSA8LSBjb3VudHJpZXNbaV0KfQoKCm1leF9yPC0gZ2dwbG90KCkgKyAKICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZT0iWWVhciIpICsgCiAgc2NhbGVfeV9jb250aW51b3VzKG5hbWU9Ik1pbGl0YXJ5IEV4cGVuZGl0dXJlcyBSYXRpbyIpICsKICBnZW9tX3JlY3QoZGF0YT1kLCBtYXBwaW5nPWFlcyh4bWluPXgxLCB4bWF4PXgyLCB5bWluPTAsIHltYXg9bWF4KE5NQ19tcF9yYXRpb3MkbWlsZXgpLCBmaWxsPUNvbmZsaWN0KSxhbHBoYT0wLjEpICsKICBnZW9tX2xpbmUoZGF0YSA9IE5NQ19tcF9yYXRpb3MsIGFlcyh4ID0geWVhciwgeSA9IG1pbGV4LCBjb2xvciA9IGNvdW50cnksIGdyb3VwID0gY291bnRyeSkpICsKICAjZ2d0aXRsZSgiQ05JQyBieSBZZWFyIGZvciBNYWpvciBQb3dlcnMgVG9kYXkiKSArIAogIHRoZW1lX2NsYXNzaWMoKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoInNhbG1vbiIsICJwYWxldHVycXVvaXNlMyIsICJsaWdodHN0ZWVsYmx1ZTIiLCAibGlnaHRzdGVlbGJsdWU0IiwgImxpZ2h0c3RlZWxibHVlMyIsICJwaW5rMyIpKSsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZT0iUGFpcmVkIikrCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IC41KSxsZWdlbmQucG9zaXRpb249Im5vbmUiKQoKbWlwX3I8LSBnZ3Bsb3QoKSArIAogIHNjYWxlX3hfY29udGludW91cyhuYW1lPSJZZWFyIikgKyAKICBzY2FsZV95X2NvbnRpbnVvdXMobmFtZT0iTWlsaXRhcnkgUGVyc29ubmVsIFJhdGlvIikgKwogIGdlb21fcmVjdChkYXRhPWQsIG1hcHBpbmc9YWVzKHhtaW49eDEsIHhtYXg9eDIsIHltaW49MCwgeW1heD1tYXgoTk1DX21wX3JhdGlvcyRtaWxwZXIpLCBmaWxsPUNvbmZsaWN0KSxhbHBoYT0wLjEpICsKICBnZW9tX2xpbmUoZGF0YSA9IE5NQ19tcF9yYXRpb3MsIGFlcyh4ID0geWVhciwgeSA9IG1pbHBlciwgY29sb3IgPSBjb3VudHJ5LCBncm91cCA9IGNvdW50cnkpKSArCiAgI2dndGl0bGUoIkNOSUMgYnkgWWVhciBmb3IgTWFqb3IgUG93ZXJzIFRvZGF5IikgKyAKICB0aGVtZV9jbGFzc2ljKCkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCJzYWxtb24iLCAicGFsZXR1cnF1b2lzZTMiLCAibGlnaHRzdGVlbGJsdWUyIiwgImxpZ2h0c3RlZWxibHVlNCIsICJsaWdodHN0ZWVsYmx1ZTMiLCAicGluazMiKSkrCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGU9IlBhaXJlZCIpKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAuNSksbGVnZW5kLnBvc2l0aW9uPSJub25lIikKCgpucmdfcjwtIGdncGxvdCgpICsgCiAgc2NhbGVfeF9jb250aW51b3VzKG5hbWU9IlllYXIiKSArIAogIHNjYWxlX3lfY29udGludW91cyhuYW1lPSJQcmltYXJ5IEVuZXJneSBDb25zdW1wdGlvbiBSYXRpbyIpICsKICBnZW9tX3JlY3QoZGF0YT1kLCBtYXBwaW5nPWFlcyh4bWluPXgxLCB4bWF4PXgyLCB5bWluPTAsIHltYXg9bWF4KE5NQ19tcF9yYXRpb3MkcGVjKSwgZmlsbD1Db25mbGljdCksYWxwaGE9MC4xKSArCiAgZ2VvbV9saW5lKGRhdGEgPSBOTUNfbXBfcmF0aW9zLCBhZXMoeCA9IHllYXIsIHkgPSBwZWMsIGNvbG9yID0gY291bnRyeSwgZ3JvdXAgPSBjb3VudHJ5KSkgKwogICNnZ3RpdGxlKCJDTklDIGJ5IFllYXIgZm9yIE1ham9yIFBvd2VycyBUb2RheSIpICsgCiAgdGhlbWVfY2xhc3NpYygpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9Yygic2FsbW9uIiwgInBhbGV0dXJxdW9pc2UzIiwgImxpZ2h0c3RlZWxibHVlMiIsICJsaWdodHN0ZWVsYmx1ZTQiLCAibGlnaHRzdGVlbGJsdWUzIiwgInBpbmszIikpKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlPSJQYWlyZWQiKSsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gLjUpLGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpCgoKaWFzX3I8LSBnZ3Bsb3QoKSArIAogIHNjYWxlX3hfY29udGludW91cyhuYW1lPSJZZWFyIikgKyAKICBzY2FsZV95X2NvbnRpbnVvdXMobmFtZT0iSXJvbiBhbmQgU3RlZWwgUHJvZHVjdGlvbiBSYXRpbyIpICsKICBnZW9tX3JlY3QoZGF0YT1kLCBtYXBwaW5nPWFlcyh4bWluPXgxLCB4bWF4PXgyLCB5bWluPTAsIHltYXg9bWF4KE5NQ19tcF9yYXRpb3MkaXJzdCksIGZpbGw9Q29uZmxpY3QpLGFscGhhPTAuMSkgKwogIGdlb21fbGluZShkYXRhID0gTk1DX21wX3JhdGlvcywgYWVzKHggPSB5ZWFyLCB5ID0gaXJzdCwgY29sb3IgPSBjb3VudHJ5LCBncm91cCA9IGNvdW50cnkpKSArCiAgI2dndGl0bGUoIkNOSUMgYnkgWWVhciBmb3IgTWFqb3IgUG93ZXJzIFRvZGF5IikgKyAKICB0aGVtZV9jbGFzc2ljKCkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCJzYWxtb24iLCAicGFsZXR1cnF1b2lzZTMiLCAibGlnaHRzdGVlbGJsdWUyIiwgImxpZ2h0c3RlZWxibHVlNCIsICJsaWdodHN0ZWVsYmx1ZTMiLCAicGluazMiKSkrCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGU9IlBhaXJlZCIpKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAuNSksbGVnZW5kLnBvc2l0aW9uPSJub25lIikKCgp1cnBfcjwtIGdncGxvdCgpICsgCiAgc2NhbGVfeF9jb250aW51b3VzKG5hbWU9IlllYXIiKSArIAogIHNjYWxlX3lfY29udGludW91cyhuYW1lPSJVcmJhbiBQb3B1bGF0aW9uIFJhdGlvIikgKwogIGdlb21fcmVjdChkYXRhPWQsIG1hcHBpbmc9YWVzKHhtaW49eDEsIHhtYXg9eDIsIHltaW49MCwgeW1heD1tYXgoTk1DX21wX3JhdGlvcyR1cG9wKSwgZmlsbD1Db25mbGljdCksYWxwaGE9MC4xKSArCiAgZ2VvbV9saW5lKGRhdGEgPSBOTUNfbXBfcmF0aW9zLCBhZXMoeCA9IHllYXIsIHkgPSB1cG9wLCBjb2xvciA9IGNvdW50cnksIGdyb3VwID0gY291bnRyeSkpICsKICAjZ2d0aXRsZSgiQ05JQyBieSBZZWFyIGZvciBNYWpvciBQb3dlcnMgVG9kYXkiKSArIAogIHRoZW1lX2NsYXNzaWMoKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoInNhbG1vbiIsICJwYWxldHVycXVvaXNlMyIsICJsaWdodHN0ZWVsYmx1ZTIiLCAibGlnaHRzdGVlbGJsdWU0IiwgImxpZ2h0c3RlZWxibHVlMyIsICJwaW5rMyIpKSsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZT0iUGFpcmVkIikrCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IC41KSxsZWdlbmQucG9zaXRpb249Im5vbmUiKQoKCgp0b3BfcjwtIGdncGxvdCgpICsgCiAgc2NhbGVfeF9jb250aW51b3VzKG5hbWU9IlllYXIiKSArIAogIHNjYWxlX3lfY29udGludW91cyhuYW1lPSJUb3RhbCBQb3B1bGF0aW9uIFJhdGlvIikgKwogIGxhYnMoY29sb3IgPSdDb3VudHJ5JykrCiAgZ2VvbV9yZWN0KGRhdGE9ZCwgbWFwcGluZz1hZXMoeG1pbj14MSwgeG1heD14MiwgeW1pbj0wLCB5bWF4PW1heChOTUNfbXBfcmF0aW9zJHRwb3ApLCBmaWxsPUNvbmZsaWN0KSxhbHBoYT0wLjEpICsKICBnZW9tX2xpbmUoZGF0YSA9IE5NQ19tcF9yYXRpb3MsIGFlcyh4ID0geWVhciwgeSA9IHRwb3AsIGNvbG9yID0gY291bnRyeSwgZ3JvdXAgPSBjb3VudHJ5KSkgKwogICNnZ3RpdGxlKCJDTklDIGJ5IFllYXIgZm9yIE1ham9yIFBvd2VycyBUb2RheSIpICsgCiAgdGhlbWVfY2xhc3NpYygpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9Yygic2FsbW9uIiwgInBhbGV0dXJxdW9pc2UzIiwgImxpZ2h0c3RlZWxibHVlMiIsICJsaWdodHN0ZWVsYmx1ZTQiLCAibGlnaHRzdGVlbGJsdWUzIiwgInBpbmszIikpKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlPSJQYWlyZWQiKSsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gLjUpLGxlZ2VuZC5wb3NpdGlvbj0iYm90dG9tIixsZWdlbmQua2V5LnNpemUgPSB1bml0KDEsICJjbSIpLCBsZWdlbmQudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTApICwgbGVnZW5kLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MTApKQogIAoKCmdfbGVnZW5kPC1mdW5jdGlvbihhLmdwbG90KXsKICB0bXAgPC0gZ2dwbG90X2d0YWJsZShnZ3Bsb3RfYnVpbGQoYS5ncGxvdCkpCiAgbGVnIDwtIHdoaWNoKHNhcHBseSh0bXAkZ3JvYnMsIGZ1bmN0aW9uKHgpIHgkbmFtZSkgPT0gImd1aWRlLWJveCIpCiAgbGVnZW5kIDwtIHRtcCRncm9ic1tbbGVnXV0KICByZXR1cm4obGVnZW5kKX0KCm15bGVnZW5kPC1nX2xlZ2VuZCh0b3BfcikKCgojZ3JpZF9hcnJhbmdlX3NoYXJlZF9sZWdlbmQoaWFzLCBpYXNfciwgbWV4LCBtZXhfciwgbWlwLCBtaXBfciwgdXJwLCB1cnBfciwgdG9wLCB0b3BfciwgbnJvdyA9IDYpCgoKYGBgCgoKCiNgYGB7ciAgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9NyB9CmBgYHtyIGZpZy53aWR0aD0xNiwgZmlnLmhlaWdodD0xNH0KCmdyaWQuYXJyYW5nZShhcnJhbmdlR3JvYihpYXMsIGlhc19yLCBtZXgsIG1leF9yLCBtaXAsIG1pcF9yICsgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IC41KSwgbGVnZW5kLnBvc2l0aW9uPSJub25lIiksbnJvdz0zLCBuY29sID0yKSxteWxlZ2VuZCwgaGVpZ2h0cz1jKDEwLDEpKQoKI2dyaWQuYXJyYW5nZShpYXMsIGlhc19yLCBtZXgsIG1leF9yLCBtaXAsIG1pcF9yLCB1cnAsIHVycF9yLCB0b3AsIHRvcF9yLCBucm93PTYpCmBgYAoKCldpdGggdGhlIElyb24gYW5kIFN0ZWVsIFByb2R1Y3Rpb24gcmF0aW8sIHlvdSBjYW4gc2VlIHRoYXQgaXQgZm9sbG93cyB0byBzYW1lIHBhdHRlcm4gYXMgdGhlIENJTkMgZm9yIHRoZSBVUyBkdXJpbmcgdGhpcyB0aW1lIHBlcmlvZC4gVGhlIHJhdGlvIHBlYWtzIHRvd2FyZHMgdGhlIGVuZCBvZiBXV0kgYW5kIFdXSUkgYW5kIGRlY3JlYXNlcyBpbiB0aGUgdGltZSBwZXJpb2QgYmV0d2VlbiB0aGUgdHdvIHdhcnMuIFRpbGwgYWJvdXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgVmlldG5hbSBXYXIsIHJvdWdobHkgMTk1NSwgdGhlIFVTIGRvbWluYXRlZCB0aGUgd29ybGQgaW4gSXJvbiBhbmQgU3RlZWwgcHJvZHVjdGlvbiBhbmQgc28gdGhpcyB2YWx1ZSBoYWQgaHVnZSBpbXBhY3QgdGhlIFVT4oCZcyBDSU5DIHNjb3JlLiBHZW5lcmFsbHksIGR1cmluZyBtb3N0IHdhcnMsIHRoZSBVUyBoYXMgdGhlIG1vc3QgbWlsaXRhcnkgcHJvZHVjdGlvbiBidXQgbG9zdCBpdHMgcG9zaXRpb24gdG93YXJkIHMgdGhlIGVuZCBvZiB0aGUgVmlldG5hbSB3YXIgd2hlbiBSdXNzaWEgc3VycGFzc2VkIHRoZSBVUy4gVGhlIFVuaXRlZCBLaW5nZG9tIG1haW50YWluZWQgaXRzIGlyb24gYW5kIHN0ZWVsIHByb2R1Y3Rpb24sIGJ1dCBzaW5jZSBVU0EgYW5kIFJ1c3NpYSB3ZXJlIGluY3JlYXNpbmcgdGhlaXIgcHJvZHVjdGlvbiwgdGhlIFVLcyByYXRpbyBoYXMgYmVlbiBzdGVhZGlseSBkZWNyZWFzaW5nIHNpbmNlIHRoZSAxOTAwcywgdmVyeSBzaW1pbGFyIHRvIHRoZSBwYXR0ZXJuIG9ic2VydmVkIHdpdGggdGhlIENJTkMgc2NvcmUuIAoKTG9va2luZyBhdCBtaWxpdGFyeSBleHBlbmRpdHVyZSB3ZSBzZWUgdGhhdCB0aGUgVVMgYW5kIFJ1c3NpYSBoYWQgYmVlbiBzaWduaWZpY2FudGx5IGludmVzdGluZyBtb3JlIGluIHRoZSBtaWxpdGFyeSB0aHJvdWdob3V0IHRoZSBjb2xkIHdhci4gT24gdGhlIG90aGVyIGhhbmQsIGJvdGggY291bnRyaWVzIGRlY3JlYXNlIHRoZWlyIG1pbGl0YXJ5IHBlcnNvbm5lbCBhZnRlciB0aGV5IHBlYWtlZCBhdCB0aGUgZW5kIG9mIFdXSUkuIFRoZXNlIGZpbmRpbmdzIGFyZSBjb25zaXN0ZW50IHdpdGggdGhlIENvbGQgV2FyIHdoZXJlIHRoZSBVUyBhbmQgUnVzc2lhIHdlcmUgaW4gYW4gYXJtcyByYWNlIHdoZXJlIHRoZXkgaGVhdmlseSBpbnZlc3RlZCBpbiBtaWxpdGFyeSB0ZWNobm9sb2d5IGJ1dCBkaWQgbm90IGVuZ2FnZSBpbiBhbnkgbGFyZ2Ugc2NhbGUgYmF0dGxlcy4gVGhlIFVT4oCZcyBtaWxpdGFyeSBleHBlbmRpdHVyZXMgcmF0aW8gcGVha3MgdGhlIHNhbWUgeWVhciBpdHMgQ0lOQyBzY29yZSBhbmQgaXJvbiBhbmQgc3RlZWwgcHJvZHVjdGlvbiByYXRpby4KCkluIHRoZSBmZXcgeWVhcnMgYmVmb3JlIFdXSUksIHlvdSBzZWUgR2VybWFueeKAmXMgbWlsaXRhcnkgZXhwZW5kaXR1cmVzIHJhdGlvIGluY3JlYXNlIHF1aXRlIHJhcGlkbHkgYW5kIHRoZSBtaWxpdGFyeSBwZXJzb25uZWwgcmF0aW8gc2F3IGEgZHJhc3RpYyBpbmNyZWFzZSBpbiB0aGUgb25lIHllYXIgYmVmb3JlIGluY3JlYXNpbmcgcXVpdGUgcmFwaWRseS4gQWx0aG91Z2ggbm90IGFzIGRyYXN0aWMsIEphcGFuIGFuZCBDaGluYSBmb2xsb3cgYSBzaW1pbGFyIHBhdHRlcm4gd2hlcmUgdGhlIG1pbGl0YXJ5IGludmVzdG1lbnQgaW5jcmVhc2VkIHNpZ25pZmljYW50bHkgYSBmZXcgeWVhcnMgcHJpb3IgdG8gV1dJSSBhbmQgdGhlIEtvcmVhbiBXYXIsIHJlc3BlY3RpdmVseSwgYW5kIHRoZSBtaWxpdGFyeSBwZXJzb25uZWwgcmF0aW8gZHJhc3RpY2FsbHkgaW5jcmVhc2VkIHJpZ2h0IGJlZm9yZSB0aGUgd2Fycy4gVGhpcyBzdWdnZXN0cyB0aGF0IGluIHllYXJzIGJlZm9yZSB0aGUgd2FycywgdGhlc2UgY291bnRyaWVzIHN0YXJ0ZWQgaW52ZXN0aW5nIGluIGFuZCBwcmVwYXJpbmcgdGhlaXIgbWlsaXRhcmllcyBmb3Igd2FyLiBUaGUgY291bnRyaWVzIHRoYXQgd2VyZSBvbiB0aGUgcmVhY3RpdmUgc2lkZSwgdGhlIFVTLCBSdXNzaWEgYW5kIHRoZSBVSywgdGhlaXIgbWlsaXRhcnkgcHJvZHVjdGlvbiByYXRpb3MgYW5kIG1pbGl0YXJ5IGV4cGVuZGl0dXJlcyByYXRpb3Mgb25seSBpbmNyZWFzZWQgZHVyaW5nIHRoZSB3YXIuIAoKCgojI2BgYHtyICBmaWcud2lkdGg9MywgZmlnLmhlaWdodD0xfQpgYGB7ciBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9M30KTk1DX3Y8LSBmaWx0ZXIoTk1DX3JhdGlvcywgTk1DX3JhdGlvcyR5ZWFyICVpbiUgYygxOTcwOjIwMDApKQpOTUNfcmF0aW9zX3Y8LSBmaWx0ZXIoTk1DX3JhdGlvcywgTk1DX3JhdGlvcyR5ZWFyICVpbiUgYygxOTcwOjIwMDApKQojbmFtZXMgPC0gYygiTm9ydGggS29yZWEiLCAiU291dGggS29yZWEiLCAiQWZnaGFuaXN0YW4iICAsICJWaWV0bmFtIiwgIlJlcHVibGljIG9mIFZpZXRuYW0iKQojY29kZTwtIGMoNzMxLCA3MzIsNzAwLCA4MTYsIDgxNykKbmFtZXMgPC0gYygiSXJhcSIpCmNvZGUgPC0gYyg2NDUpCk5NQ192PC0gZmlsdGVyKE5NQ192LCBOTUNfdiRjY29kZSAlaW4lIGNvZGUpCk5NQ19yYXRpb3NfdjwtIGZpbHRlcihOTUNfcmF0aW9zX3YsIE5NQ19yYXRpb3NfdiRjY29kZSAlaW4lIGNvZGUpCmZvciggaSBpbiBjKDE6bGVuZ3RoKGNvZGUpKSl7CiAgTk1DX3JhdGlvc192JGNvdW50cnlbTk1DX3JhdGlvc192JGNjb2RlID09IGNvZGVbaV0gXTwtIG5hbWVzW2ldCiAgTk1DX3YkY291bnRyeVtOTUNfdiRjY29kZSA9PSBjb2RlW2ldIF08LSBuYW1lc1tpXQp9CgoKYTwtIGdncGxvdCgpICsgCiAgc2NhbGVfeF9jb250aW51b3VzKG5hbWU9IlllYXIiKSArIAogIHNjYWxlX3lfY29udGludW91cyhuYW1lPSJSYXRpbyIpICsgCiAgZ2VvbV9saW5lKGRhdGEgPSBOTUNfcmF0aW9zX3YsIGFlcyh4ID0geWVhciwgeSA9IG1pbGV4KSwgY29sb3VyID0gImluZGlhbnJlZDMiKSArCiAgZ2d0aXRsZSgiSXJhcSBNaWxpdGFyeSBFeHBlbmRpdHVyZXMgUmF0aW8iKSArIAogIGdlb21fcmVjdChkYXRhPWQsIG1hcHBpbmc9YWVzKHhtaW49MTk5MCwgeG1heD0xOTkxLCB5bWluPTAsIHltYXg9LjAyNSksYWxwaGE9MC4wMykgKwogIHRoZW1lX2NsYXNzaWMoKSArCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IC41LCBzaXplID0xMCApLCAgIGF4aXMudGV4dC54ID1lbGVtZW50X3RleHQoc2l6ZSA9NiksIGF4aXMudGV4dC55ID1lbGVtZW50X3RleHQoc2l6ZSA9NiksIGF4aXMudGl0bGUueCA9ZWxlbWVudF90ZXh0KHNpemUgPTgpLCBheGlzLnRpdGxlLnkgPWVsZW1lbnRfdGV4dChzaXplID04KSwgbGVnZW5kLnBvc2l0aW9uPSJub25lIikKCmI8LSBnZ3Bsb3QoKSArIAogIHNjYWxlX3hfY29udGludW91cyhuYW1lPSJZZWFyIikgKyAKICBzY2FsZV95X2NvbnRpbnVvdXMobmFtZT0iUmF0aW8iKSArCiAgZ2VvbV9saW5lKGRhdGEgPSBOTUNfcmF0aW9zX3YsIGFlcyh4ID0geWVhciwgeSA9IG1pbHBlciksIGNvbG91cj0gInJveWFsYmx1ZTMiKSArCiAgZ2d0aXRsZSgiSXJhcSBNaWxpdGFyeSBQZXJzb25uZWwgUmF0aW8iKSArIAogIGdlb21fcmVjdChkYXRhPWQsIG1hcHBpbmc9YWVzKHhtaW49MTk5MCwgeG1heD0xOTkxLCB5bWluPTAsIHltYXg9LjA1KSwgYWxwaGE9MC4wMykgKwogIHRoZW1lX2NsYXNzaWMoKSArCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IC41LCBzaXplID0xMCApLCAgIGF4aXMudGV4dC54ID1lbGVtZW50X3RleHQoc2l6ZSA9NiksIGF4aXMudGV4dC55ID1lbGVtZW50X3RleHQoc2l6ZSA9NiksIGF4aXMudGl0bGUueCA9ZWxlbWVudF90ZXh0KHNpemUgPTgpLCBheGlzLnRpdGxlLnkgPWVsZW1lbnRfdGV4dChzaXplID04KSwgbGVnZW5kLnBvc2l0aW9uPSJub25lIikKCmdyaWQuYXJyYW5nZShhLGIsbnJvdyA9IDEpCmBgYAoKV2Ugd2FudGVkIHRvIHNlZSBpZiB0aGlzIHRoaXMgc2FtZSBwYXR0ZXJuIHdhcyBwcmVzZW50IGluIG90aGVyIGNvbmZsaWN0cy4gRHVyaW5nIHRoZSBHdWxmIFdhciwgSXJhcSBpbnZhZGVkIEt1d2FpdCBhbmQgaXQgd2FzIG1ldCB3aXRoIGludGVybmF0aW9uYWwgY29uZGVtbmF0aW9uIGFuZCB0aGUgVVMgYW5kIG90aGVyIG5hdGlvbnMgam9pbmVkIGZvcmNlcyB0byBzdG9wIElyYXEuIEJ1dCBiZWZvcmUgdGhlIGludmFzaW9uIGluIHdhciB3ZSBzZWUgSXJhceKAmXMgbWlsaXRhcnkgZXhwZW5kaXR1cmVzIGFuZCBwZXJzb25uZWwgcmF0aW9zIGluY3JlYXNpbmcuIFRoZSBncmF5IHNoYWRlZCBib3ggaW5kaWNhdGVzIHRoZSB0aW1lIHBlcmlvZCBvZiB0aGUgR3VsZiBXYXIgKDE5OTAtMTk5MSkuIEluIHRoZSAxOTgwcywgSXJhceKAmXMgbWlsaXRhcnkgZXhwZW5kaXR1cmUgcmF0aW8gZHJhc3RpY2FsbHkgaW5jcmVhc2VkIGFuZCB0aGVuIHRoZXJlIHdhcyBhIHN1ZGRlbiBzcGlrZSBpbiBtaWxpdGFyeSBwZXJzb25uZWwgcmlnaHQgYmVmb3JlIHRoZSBzdGFydCBvZiB0aGUgd2FyLiAgCgoKI2BgYHtyIGZpZy53aWR0aD03LjUsIGZpZy5oZWlnaHQ9IDN9CmBgYHtyIGZpZy53aWR0aD0xNCwgZmlnLmhlaWdodD02fQpjdCA8LSBjKCJVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EiLCAiVW5pdGVkIEtpbmdkb20iLCAiRnJhbmNlIiwgIlJ1c3NpYSIsIkdlcm1hbnkiLCAiSXRhbHkiLCAiSmFwYW4iLCAiQ2hpbmEiKQpjdF9jY29kZSA8LSBtZW1iZXJfYWxsaWFuY2VzJGNjb2RlW21hdGNoKGN0LCBtZW1iZXJfYWxsaWFuY2VzJHN0YXRlX25hbWUpXQoKTk1DX2N0IDwtIGZpbHRlcihOTUMsIE5NQyR5ZWFyICVpbiUgYWxsX3llYXIpCk5NQ19jdCA8LSBmaWx0ZXIoTk1DX2N0LCBOTUNfY3QkY2NvZGUgJWluJSBjdF9jY29kZSkKZm9yKCBpIGluIGMoMTpsZW5ndGgoY3RfY2NvZGUpKSl7CiAgTk1DX2N0JGNvdW50cnlbTk1DX2N0JGNjb2RlID09IGN0X2Njb2RlW2ldXSA8LSBjdFtpXQp9CgphPC0gZ2dwbG90KE5NQ19jdCwgYWVzKGNvdW50cnksIHllYXIsIGZpbGwgPSBjaW5jKSkgKyBnZW9tX3RpbGUoKSsKICB4bGFiKCJDb3VudHJ5IikgKwogIHlsYWIoIlllYXIiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKyAKICBnZ3RpdGxlKCJDSU5DIEhlYXRtYXAgZm9yIE1ham9yIFBvd2VycyIpICsgCiAgdGhlbWVfY2xhc3NpYygpKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSsgCiAgY29vcmRfZmxpcCgpICsKICBsYWJzKGNvbG9yID0nQ0lOQycpCgoKdG9wQ2FzIDwtIGMoIk5ldGhlcmxhbmRzIiwgIll1Z29zbGF2aWEiLCAiTGl0aHVhbmlhIiwgIlBvbGFuZCIsICJBdXN0cmlhIiwgIkh1bmdhcnkiLCAiUm9tYW5pYSIsICJFc3RvbmlhIiwgIkx1eGVtYm91cmciKQp0b3BDYXNfY2NvZGUgPC0gbWVtYmVyX2FsbGlhbmNlcyRjY29kZVttYXRjaCh0b3BDYXMsIG1lbWJlcl9hbGxpYW5jZXMkc3RhdGVfbmFtZSldCgoKTk1DX2NhcyA8LSBmaWx0ZXIoTk1DLCBOTUMkeWVhciAlaW4lIGFsbF95ZWFyKQpOTUNfY2FzIDwtIGZpbHRlcihOTUNfY2FzLCBOTUNfY2FzJGNjb2RlICVpbiUgdG9wQ2FzX2Njb2RlKQpmb3IoIGkgaW4gYygxOmxlbmd0aCh0b3BDYXNfY2NvZGUpKSl7CiAgTk1DX2NhcyRjb3VudHJ5W05NQ19jYXMkY2NvZGUgPT0gdG9wQ2FzX2Njb2RlW2ldXSA8LSB0b3BDYXNbaV0KfQoKYjwtIGdncGxvdChOTUNfY2FzLCBhZXMoY291bnRyeSwgeWVhciwgZmlsbCA9IGNpbmMpKSArIGdlb21fdGlsZSgpKwogIHhsYWIoIkNvdW50cnkiKSArCiAgeWxhYigiWWVhciIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArIAogIGdndGl0bGUoIkNJTkMgSGVhdG1hcCBmb3IgQ291bnRyaWVzIHdpdGggdGhlIG1vc3QgSG9sb2NhdXN0IENhc3VhbHRpZXMiKSArIAogIHRoZW1lX2NsYXNzaWMoKSsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKwogIGNvb3JkX2ZsaXAoKSArCiAgbGFicyhjb2xvciA9J0NJTkMnKQogIAoKZ3JpZC5hcnJhbmdlKGEsYiwgbnJvdyA9IDEgKQpgYGAKCkZpbmFsbHksIHVzaW5nIHRoZSBoZWF0IG1hcHMsIHdlIGxvb2tlZCBhdCBpbXBhY3Qgb24gQ0lOQyBhZnRlciBhIHdhci4gT24gdGhlIGxlZnQgaXMgYSBoZWF0IG1hcCBvZiB0aGUgbWFqb3IgcG93ZXJzLiBZb3UgY2FuIHNlZSB0aGF0IEZyYW5jZSwgR2VybWFueSBhbmQgSmFwYW4gaGFkIG1pc3NpbmcgQ0lOQyB2YWx1ZXMgYXQgdGhlIGVuZCBvZiBXb3JsZCBXYXIgSUkuIFRob3NlIHBlcmlvZHMgb2YgbWlzc2luZyB2YWx1ZXMgY29ycmVzcG9uZCB0byB0aGUgcmVjb3ZlcnkgcGVyaW9kIGZvciBlYWNoIG9mIHRob3NlIGNvdW50cmllcyBmb2xsb3dpbmcgdGhlIHdhci4gTmV4dCwgd2UgbG9va2VkIHRvIHNlZSB3aGF0IG90aGVyIGNvdXRyaWVzIGhhZCBnYXBzIGluIHRoZWlyIENJTkMgZGF0YS4gTW9zdCBvZiB0aGUgY291bnRyaWVzIHRoYXQgaGF2ZSBtaXNzaW5nIGdhcHMgYXJlIEVhc3Rlcm4gRXVyb3BlYW4gY291bnRyaWVzIHRoYXQgd2hlcmUgaGVhdmlsaXkgaW1wYWN0ZWQgYnkgdGhlIEhvbG9jYXVzdCBhbmQgYnkgdGhlIHN0cnVnZ2xlIHRvIGVuZCBDb21tdW5pc20gaW4gdGhlIHJlZ2lvbi4gVGhpcyBpbmRpYWN0ZXMgdGhhdCBmb3IgY291bnRyaWVzIHRoYXQgYXJlIGdvaW5nIHRocm91Z2ggaW50ZW5zZSBkZXN0cnVjdGlvbiBvciByZWZvcm1hdGlvbiwgdGhleSBkbyBub3QgaGF2ZSBhbnkgQ0lOQyBpbmZvcm1hdGlvbi4KCgoKKipOZXh0IFN0ZXBzICoqIApUbyBnZXQgZXZlbiBtb3JlIGludG8gZGV0YWlsIGFuZCBjb250ZXh0IGFyb3VuZCBjZXJ0YWluIGNoYXJhY3RlcmlzdGljcywgd2Ugd2FudCB0byBsb29rIGF0IHNwZWNpZmljIGV2ZW50cyBsaWtlIHBlYXJsIGhhcmJvciBvciBDaGluYeKAmXMgaW52YXNpb24gb2YgTWFsYXlzaWEgYW5kIG90aGVyIHBpdm90YWwgbW9tZW50cyBpbiB3YXJzIHRvIHNlZSBob3cgdGhvc2UgZXZlbnRzIGltcGFjdCB0aGUgQ0lOQyBhbmQgaXRzIHZhcmlvdXMgY29tcG9uZW50cy4gIAoKQSBwcm9ibGVtIHdpdGggTk1DIGlzIHRoYXQgdGhlcmUgYXJlIG1hbnkgb3RoZXIgZmFjdG9ycyB0aGF0IGRldGVybWluZSBhIHBvd2VyIG9mIGEgbmF0aW9uIHJhdGhlciB0aGFuIHRoZSA2IE5NQyBmYWN0b3JzLiBPbmUgb2YgdGhlIG1ham9yIGNvbnNpZGVyYXRpb25zIHRoYXQgaXMgbm90IHRha2VuIGludG8gYWNjb3VudCBhcmUgZGlwbG9tYXRpYyByZWxhdGlvbnMgYW5kIGRlYWxpbmdzLiBEaXBsb21hdGljIHJlbGF0aW9ucyBwbGF5IGEgbWFqb3Igcm9sZSBpcyB0aGUgcHJldmVudGlvbiBhbmQgY29uY2x1c2lvbiBvZiBjb25mbGljdHMuIFdpdGggdGhpcyBkYXRhLCBpdCB3YXMgbm90IHBvc3NpYmxlIHRvIGZhY3RvciB0aGF0IGluLiAKCkFkZGl0aW9uYWxseSwgYW5vdGhlciB0aGluZyB0byBjb25zaWRlciBpcyBkaWZmZXJlbmNlcyBpbiBwb2xpY2llcyBiZXR3ZWVuIGRpZmZlcmVudCBjb3VudHJpZXMuIFdlIHNlZSB0aGF0IG1pbGl0YXJ5IGV4cGVuZGl0dXJlcyBoYXZlIGJlZW4gaW5jcmVhc2luZyBmb3IgdGhlIFVTIHNpbmNlIHRoZSBDb2xkIFdhciBidXQgUnVzc2lh4oCZcyBtaWxpdGFyeSBleHBlbmRpdHVyZXMgdGFrZSBhIHN1ZGRlbiBkcm9wIGF0IHRoZSBlbmQgb2YgdGhlIENvbGQgV2FyLiBTaW5jZSB0aGVuIFJ1c3NpYSBoYXMgYmVlbiBjdXR0aW5nIG1pbGl0YXJ5IHNwZW5kaW5nIHRpbGwgdG9kYXkuIEV2ZW4gd2l0aCBpdHMgcGFydGljaXBhdGlvbiBpbiB0aGUgQWZnaGFuaXN0YW4gV2FyLCBSdXNzaWHigJlzIG1pbGl0YXJ5IGV4cGVuZGl0dXJlcyBoYXZlIG5vdCBpbmNyZWFzZS4gT24gdGhlIGNvbnRyYXJ5LCBpbiB0aGUgVVMgdG9kYXksIHBvbGl0aWNpYW5zIGFyZSBwcm9wb3NpbmcgYSBGZWRlcmFsIEJ1ZGdldHMgd2l0aCBpbmNyZWFzZXMgaW4gbWlsaXRhcnkgc3BlbmRpbmcuIFRoaXMgZGlmZmVyZW5jZSBpcyBkdWUgdG8gZGlmZmVyZW5jZXMgaW4gcG9saWNpZXMgb2YgdGhlIGNvdW50cmllcy4gVGh1cyB0aGUgcmVhY3Rpb25zIG9mIGNvdW50cmllcyB0byBldmVudHMgd2lsbCBkcmFzdGljYWxseSB2YXJ5IGJhc2VkIG9uIHRoZWlyIHBvbGljaWVzIGFuZCBpdCBiZWNhdXNlIGhhcmQgdG8gZGlzdGluZ3Vpc2ggYW4gb3ZlcmFsbCBwYXR0ZXJuLiAKCkFub3RoZXIgZHJhd2JhY2sgb2YgTk1DIGlzIHRoYXQgaXQgY2Fubm90IHRha2UgaW50byBhY2NvdW50IGNoYW5nZXMgaW4gdW5pdmVyc2FsIHByaW9yaXRpZXMuIEZvciBleGFtcGxlLCB3aXRoIGFuIGluY3JlYXNlZCBjb25jZXJuIGZvciBjbGltYXRlIGNoYW5nZSBhbmQgc2NhcmUgbmF0dXJhbCByZXNvdXJjZXMgYW5kIGFsc28gd2l0aCBhZHZhbmNlbWVudHMgaW4gdGVjaG5vbG9neSwgaXJvbiBhbmQgc3RlZWwgcHJvZHVjdGlvbiBtaWdodCBzdGFydCB0byBkZWNyZWFzZSBkcmFzdGljYWxseSBpbiB0aGUgZnV0dXJlIHNvIGl0IG1heSBubyBsb25nZXIgYmUgYSB2YWxpZCBtZWFzdXJlIG9mIHBvd2VyLiAgU2ltaWxhcmx5LCBhZHZhbmNlbWVudHMgaW4gdGVjaG5vbG95IHdvdWxkIGRlY3JlYXNlIHRoZSBuZWVkIGZvciBtaWxpdGFyeSBwZXJzb25lZWwuIFRoZSBpc3N1ZSB3aXRoIE5NQyBpcyB0aGF0IGl0IGNhbm5vdCB0YWtlIHN1Y2ggcG9saWN5IGNvbmNlcm5zIGFuZCBjaGFuZ2VzIGludG8gY29uc2lkZXJhdGlvbiB0byBtZWFzdXJlIG5hdGlvbmFsIHBvd2VyLiAKCgoKCiMjIyNBbGxpYW5jZXMKCgpgYGB7ciBmaWcud2lkdGg9MTQsIGZpZy5oZWlnaHQ9OH0KCmRheWRfYWxfeWVhciA8LSBmaWx0ZXIoZHlhZF9hbF95ZWFyLCBkeWFkX2FsX3llYXIkeWVhciAlaW4lIGMoMTkwMDoyMDEyKSkKZHlhZF9hbF95ZWFyJGxlbmd0aCA9IGR5YWRfYWxfeWVhciRkeWFkX2VuZF95ZWFyIC0gZHlhZF9hbF95ZWFyJGR5YWRfc3RfeWVhcgoKZGF5ZF9hbF95ZWFyJGNvbmZsaWN0IDwtICIwIgpkeWFkX2FsX3llYXIkY291bnQgPC0gMSAKCmRpcl9hbGxpYW5jZXMgPC0gZ2F0aGVyKGRpcl9hbF95ZWFyLCB0cmVhdHlfdHlwZSwgaWRpY2F0b3IsIGRlZmVuc2U6ZW50ZW50ZSkKZGlyX2FsbGlhbmNlcyA8LSBkaXJfYWxsaWFuY2VzWyFkaXJfYWxsaWFuY2VzJGlkaWNhdG9yICVpbiUgIDAsXQpkaXJfYWxsaWFuY2VzJGR5YWRfZW5kX3llYXJbZGlyX2FsbGlhbmNlcyRkeWFkX2VuZF95ZWFyICVpbiUgTkFdID0gMjAxNgpkaXJfYWxsaWFuY2VzIDwtIGRpcl9hbGxpYW5jZXNbZGlyX2FsbGlhbmNlcyR5ZWFyPjE5MDAsXQphbGxpYW5jZV9jb3VudCA8LSBkaXJfYWxsaWFuY2VzWywgYygyLDMsMTQsMTYpXQphbGxpYW5jZV9jb3VudCRjb3VudCA8LSAxIAoKZ3BfY3QgPC0gYWdncmVnYXRlKGNiaW5kKGNvdW50KSB+IGNjb2RlMStzdGF0ZV9uYW1lMSt5ZWFyK3RyZWF0eV90eXBlLCBkYXRhID1hbGxpYW5jZV9jb3VudCwgRlVOID0gc3VtICkKZ3BfY3QkQ29uZmxpY3QgPC0gIjAiCgpmb3IoaSBpbiBjKDE6bGVuZ3RoKGQkeDEpKSl7CiAgZ3BfY3RbZ3BfY3QkeWVhciA+PSBkJHgxW2ldICYgZ3BfY3QkeWVhciA8PSBkJHgyW2ldLCBsZW5ndGgoZ3BfY3QpXSA8LSBhcy5jaGFyYWN0ZXIoaSkKfQoKYGBgCgoKV1dJIHdhcyB0cmlnZ2VyZWQgYnkgdGhlIGFzc2Fzc2luYXRpb24gb2YgdGhlIEFyY2hkdWtlIEZyYW56IEZlcmRpbmFuZCBvZiBBdXN0cmlhLiBIaXMgZGVhdGggc2V0IG9mZiBkaXBsb21hdGljIGNyaXNpcyBhcyBjb3VudHJpZXMgdGhhdCB3ZXJlIG5vdCBpbnZvbHZlZCBpbiB0aGUgb3JpZ2luYWwgY29uZmxpY3Qgd2VyZSBmb3JjZWQgdG8gZ2V0IGludm9sdmVkLiBPbmNlIEF1c3RyaWEgZGVjbGFyZWQgd2FyIG9uIFNlcmJpYSBmb3IgdGhlIGRlYXRoIG9mIHRoZSBBcmNoIER1a2UsIFJ1c3NpYSBoYWQgdG8gc3RlcCBpbnRvIGRlZmVuZCBTZXJiaWEuIE9uY2UgUnVzc2lhIGVudGVyZWQgdGhlIGNvbmZsaWN0LCBHZXJtYW55IHdhcyBmb3JjZWQgdG8gZW50ZXIgdGhlIGNvbmZsaWN0IGR1ZSB0byBpdHMgYWxsaWFuY2Ugd2l0aCBBdXN0cmlhLiBEdXJpbmcgdGhlIGNvbmZsaWN0IEdlcm1hbnkgaW52YWRlZCBCZWxnaXVtOyBpbiByZXNwb25zZSwgdGhlIFVuaXRlZCBLaW5nZG9tIG1vYmlsaXplZCBkdWUgdG8gdGhlaXIgYWxsaWFuY2Ugd2l0aCBCZWxnaXVtLiBUaGlzIHBhdHRlcm4gY29udGludWVkIHRvIGV2ZW50dWFsbHkgaW52b2x2ZSBhbGwgdGhlIG1ham9yIHBvd2VycyBvZiB0aGUgd29ybGQgZm9yIGEgZGV2YXN0YXRpbmcgYmF0dGxlLiBTdWNoIGFsbGlhbmNlcyB3ZXJlIHRoZSBjYXVzZSBvZiBXb3JsZCBXYXIgSS4gU2luY2UgdGhlbiB0aGUgbnVtYmVyIG9mIEFsbGlhbmNlcyBoYXMgb25seSBncm93biBhbmQgY29udGludWVzIHRvIGdyb3cuIEZvciB0aGlzIHJlYXNvbiwgd2Ugd2FudGVkIHRvIGxvb2sgYXQgYWxsaWFuY2VzIGFuZCBzZWUgaG93IHRoZXkgY2hhbmdlIGR1cmluZyB3YXJzLiAKCkJlbG93IGlzIGJveHBsb3Qgb2YgdGhlIHRvdGFsIG51bWJlciBvZiBhbGxpYW5jZXMgdGhhdCBhcmUgaW4gZWZmZWN0IGVhY2ggeWVhciBiZXR3ZWVuIGFueSB0d28gY291bnRyaWVzLiBJdCBpcyBlYXN5IHRvIHNlZSB0aGF0IHRoZSBtZWRpYW4gbnVtYmVyIG9mIGFsbGlhbmNlcyBqdW1wZWQgdXAgc2lnbmlmaWNhbnRseSBkdXJpbmcgV1dJSSBhbmQgY29udGludWVkIHRvIGdyb3cgZHVyaW5nIHRoZSBDb2xkIFdhciBhbmQgcmVtYWluZWQgcmVsYXRpdmVseSBsZXZlbCBzaW5jZSB0aGVuLiBBbiBpbnRlcmVzdGluZyBwYXR0ZXJuIGlzIHRoYXQgdGhlIG1lZGlhbiBudW1iZXIgb2YgYWxsaWFuY2VzIGluY3JlYXNlZCBtb3JlIGluIHRoZSAxLTMgYmVmb3JlIHRoZSBlbmQgb2Ygd2FyLiBZb3UgY2FuIHNlZSB0aGlzIHBhdHRlciB3aXRoIFdXSSwgS29yZWFuIFdhciwgVmlldG5hbSBXYXIgYW5kIHRoZSBlbmQgb2YgdGhlIENvbGQgV2FyLiBBbHRob3VnaCB0aGUgQ29sZCBXYXIgd2FzIG9ubHkgYSBzdGF0ZSBvZiBzZXZlcmUgcG9saXRpY2FsIHdhciB0aGVyZSB3ZXJlIG1hbnkgcmVnaW9uYWwgYmF0dGxlcyBhbmQgdGhlIHRocmVhdCBvZiBhIGxhcmdlLXNjYWxlIG1pbGl0YXJ5IHdhciB3YXMgY29uc3RhbnQuIFRoZSBudW1iZXIgb2YgYWxsaWFuY2VzIHNpZ25pZmljYW50bHkgaW5jcmVhc2VkIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBDb2xkIFdhciB0aWxsIHRoZSBlbmQuICAKCgojYGBge3IgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTV9CmBgYHtyIGZpZy53aWR0aD0yMCwgZmlnLmhlaWdodD04fQpnZ3Bsb3QoKSArCiAgeGxhYigiWWVhciIpICsKICB5bGFiKCJDb3VudCIpKwogIGdlb21fYm94cGxvdChkYXRhID0gZ3BfY3QsIGFlcyh4ID0gYXMuZmFjdG9yKHllYXIpLCB5ID0gY291bnQsIGZpbGwgPSBDb25mbGljdCkpICsKICBnZ3RpdGxlKCJUb3RhbCBBbGxpYW5jZXMgYnkgWWVhciIpICsgCiAgdGhlbWVfY2xhc3NpYygpKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAuNSwgc2l6ZSA9IDIwKSwgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgc2l6ZSA9IDEwKSwgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksICBsZWdlbmQucG9zaXRpb249ImJvdHRvbSIsIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTUpLCAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTUpKSsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9Yygid2hpdGUiLCAibGlnaHRzdGVlbGJsdWUzIiwgInBpbmszIiwgInBhbGV0dXJxdW9pc2UzIiwgImxpZ2h0c3RlZWxibHVlMiIsICJsaWdodHN0ZWVsYmx1ZTQiLCJzYWxtb24iICksIGxhYmVscyA9IG15bGFibGVzKQoKYGBgCk5leHQgd2UgbG9va2VkIGF0IHRoZSB0eXBlcyBvZiBhbGxpYW5jZXMgZm9ybWVkIGR1cmluZyB0aGlzIHRpbWUuIFRoZSBDT1cgZGF0YSByZXBvcnRzIG9uIDQgdHlwZXMgb2YgYWxsaWFuY2VzOiBkZWZlbnNlLCBuZXV0cmFsaXR5LCBlbnRlbnRlIGFuZCBub24tYWdncmVzc2lvbi4gSW4gYSBkZWZlbnNlIGFsbGlhbmNlLCB0aGUgbWVtYmVyIHN0YXRlcyBhZ3JlZSB0byBkZWZlbmQgb25lIG9yIG1vcmUgc3RhdGVzIGluIGFsbGlhbmNlIGluIHRoZSBldmVudCBvZiBhIGNvbmZsaWN0LiBXaXRoIGEgbmV1dHJhbGl0eSBhbGxpYW5jZSwgdGhlcmUgaXMgYW4gYWdyZWVtZW50IHRvIG1haW50YWluIG5ldXRyYWxpdHkgdG93YXJkcyB0aGUgbWVtYmVycyBvZiB0aGUgYWxsaWFuY2UuIEluIG5vbi1hZ2dyZXNzaW9uIGFsbGlhbmNlLCB0aGUgbWVtYmVycyBhZ3JlZSB0byB0YWtlIG5vIG1pbGl0YXJ5IGFjdGlvbiBhZ2FpbnN0IG9uZSBhbm90aGVyLiBGaW5hbGx5LCB3aXRoIGFuIGVudGVudGUgYWxsaWFuY2UgdGhlcmUgaXMgYW4gdW5kZXJzdGFuZGluZyB0aGF0IHRoZSBzdGF0ZXMgd291bGQgY29uc3VsdCB3aXRoIG9uZSBhbm90aGVyIGlmIGEgY3Jpc2lzIG9jY3VycmVkIAoKVGhlIHBsb3RzIGJlbG93IHNob3cgdGhlIG51bWJlciBvZiBhbGxpYW5jZXMgYnkgYWxsaWFuY2UgdHlwZS4gVGhlIHRvcCByb3cgc2hvd3MgdGhlIG51bWJlciBvZiBuZXcgYWxsaWFuY2VzIHRoYXQgd2VyZSBmb3JtZWQgZWFjaCB5ZWFyIGFuZCB0aGUgc2Vjb25kIHJvdyBzaG93cyBudW1iZXIgb2YgYWxsaWFuY2VzIHRoYXQgd2VyZSB0ZXJtaW5hdGVkIHRoYXQgeWVhci4gUGxlYXNlIG5vdGUgdGhhdCBpZiBhbiBhbGxpYW5jZSB3YXMgZm9ybWVkIGJldHdlZW4gNCBzdGF0ZXMgdGhlbiB0aGVyZSB3b3VsZCA2IG5ldyBhbGxpYW5jZXMgaW4gdGhlIGRhdGEgc2V0IGJlY2F1c2UgdGhlcmUgaXMgYW4gYWxsaWFuY2UgYmV0d2VlbiBlYWNoIG9mIHRoZSA0IG1lbWJlcnMuIFNpbWlsYXJseSwgaWYgYW4gYWxsaWFuY2UgYmV0d2VlbiA0IHN0YXRlcyB3ZXJlIHRlcm1pbmF0ZWQgdGhhdCB3b3VsZCBiZSA2IGxlc3MgYWxsaWFuY2VzLgoKCiNgYGB7ciBmaWcud2lkdGg9OCwgZmlnLmhlaWdodD00fQpgYGB7ciBmaWcud2lkdGg9MTIsIGZpZy5oZWlnaHQ9OH0KZGlyX2FsXzAgPC0gZmlsdGVyKGRpcl9hbCwgZGlyX2FsJGR5YWRfc3RfeWVhciAlaW4lIGMoMTkwMDoyMDEyKSkKYWxsX3N0IDwtIGdhdGhlcihkaXJfYWxfMCwgdHJlYXR5X3R5cGUsIGlkaWNhdG9yLCBkZWZlbnNlOmVudGVudGUpCmFsbF9zdCA8LSBhbGxfc3RbIWFsbF9zdCRpZGljYXRvciAlaW4lICAwLF0KYWxsX3N0JGR5YWRfZW5kX3llYXJbYWxsX3N0JGR5YWRfZW5kX3llYXIgJWluJSBOQV0gPSAyMDE2CmFsX3N0X2NvdW50IDwtIGFsbF9zdFssIGMoMyw1LDgsMTEsMTUpXQphbF9zdF9jb3VudCRjb3VudCA8LSAxIAoKZ3Bfc3QgPC0gYWdncmVnYXRlKGNiaW5kKGNvdW50KSB+IGR5YWRfc3RfeWVhcit0cmVhdHlfdHlwZSwgZGF0YSA9YWxfc3RfY291bnQsIEZVTiA9IHN1bSApCgphIDwtIGdncGxvdCgpICsKICB4bGFiKCJZZWFyIikgKwogIHlsYWIoIkNvdW50IikrCiAgZ2VvbV9iYXIoZGF0YSA9IGFsX3N0X2NvdW50LCBhZXMoeCA9IGR5YWRfc3RfeWVhcikpICsKICBnZ3RpdGxlKCJUb3RhbCBBbGxpYW5jZXMgYnkgWWVhciB0aGV5IHN0YXJ0ZWQiKSsKICBnZW9tX3JlY3QoZGF0YT1kLCBtYXBwaW5nPWFlcyh4bWluPXgxLCB4bWF4PXgyLCB5bWluPTAsIHltYXg9bWF4KDQ1MCksIGZpbGw9Q29uZmxpY3QpLGFscGhhPTAuMikrCiAgZ2d0aXRsZSgiTnVtYmVyIG9mIEFsbGlhbmNlcyBGb3JtZWQiKSArCiAgdGhlbWVfY2xhc3NpYygpKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0iYm90dG9tIiwgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IC41KSkgKyAKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9Yygic2FsbW9uIiwgInBhbGV0dXJxdW9pc2UzIiwgImxpZ2h0c3RlZWxibHVlMiIsICJsaWdodHN0ZWVsYmx1ZTQiLCAibGlnaHRzdGVlbGJsdWUzIiwgInBpbmszIikpICsgZmFjZXRfd3JhcCh+dHJlYXR5X3R5cGUsIG5yb3cgPSAxICkKCmI8LSBnZ3Bsb3QoKSArCiAgeGxhYigiWWVhciIpICsKICB5bGFiKCJDb3VudCIpKwogIGdlb21fYmFyKGRhdGEgPSBhbF9zdF9jb3VudFthbF9zdF9jb3VudCRkeWFkX2VuZF95ZWFyIDwgMjAxNiwgXSwgYWVzKHggPSBkeWFkX2VuZF95ZWFyKSkgKwogIGdndGl0bGUoIk51bWJlciBvZiBBbGxpYW5jZXMgVGVybWluYXRlZCIpKwogIGdlb21fcmVjdChkYXRhPWQsIG1hcHBpbmc9YWVzKHhtaW49eDEsIHhtYXg9eDIsIHltaW49MCwgeW1heD1tYXgoNDUwKSwgZmlsbD1Db25mbGljdCksYWxwaGE9MC4yKSsKICB0aGVtZV9jbGFzc2ljKCkrCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJib3R0b20iLCBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gLjUpKSArIAogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCJzYWxtb24iLCAicGFsZXR1cnF1b2lzZTMiLCAibGlnaHRzdGVlbGJsdWUyIiwgImxpZ2h0c3RlZWxibHVlNCIsICJsaWdodHN0ZWVsYmx1ZTMiLCAicGluazMiKSkgKyBmYWNldF93cmFwKH50cmVhdHlfdHlwZSwgbnJvdyA9IDEpCgpncmlkLmFycmFuZ2UoYSxiLCBucm93ID0yKQoKCmBgYAoKTW9zdCBvZiB0aGUgYWxsaWFuY2VzIGZvcm1lZCB3ZXJlIGF0IHRoZSBlbmQgb2YgV1dJSSBhbmQgZHVyaW5nIHRoZSBDb2xkIFdhci4gQWxzbywgdGhlIG1vc3QgZnJlcXVlbnRseSBmb3JtZWQgYWxsaWFuY2VzIHdlcmUgZGVmZW5zZSBhbmQgZW50ZW50ZS4gU3VycHJpc2luZ2x5LCBpbiB5ZWFycyB0aGF0IHNlZSBhIGxhcmdlIGluY3JlYXNlIGluIHRoZSBudW1iZXIgb2YgYWxsaWFuY2VzIGZvcm1lZCB0aGVyZSBpcyBhbHNvIGFuIGluY3JlYXNlIGluIHRoZSBudW1iZXIgb2YgYWxsaWFuY2VzIHRoYXQgd2VyZSB0ZXJtaW5hdGVkLiBUbyBkaWcgaW4gZnVydGhlciB0byBnZXQgYSBiZXR0ZXIgdW5kZXJzdGFuZCBvZiB3aGF0IHR5cGVzIG9mIHRyZWF0aWVzIHdlcmUgZm9ybWVkIGFuZCB3aHkgdGhleSBlbmRlZCwgd2UgbG9va2VkIGF0IGluZGl2aWR1YWwgY291bnRyaWVzLiAKClRoZSBmb2xsb3dpbmcgY2hhcnRzIGFyZSBhbGwgb3JnYW5pemVkIHRoZSBzYW1lIHdheSwgdGhleSBzaG93IGEgdGltZWxpbmUgb2Ygd2hlbiB0aGUgYWxsaWFuY2VzIHN0YXJ0ZWQgdGlsbCBlaXRoZXIgdGhlIGVuZCBvZiB0aGUgYWxsaWFuY2UgKHNob3duIGluIHJlZCkgb3IgdGlsbCAyMDEyIGlmIHRoZSBhbGxpYW5jZSB3YXMgb2JzZXJ2ZWQgaW4gZWZmZWN0IGFzIG9mIERlY2VtYmVyIDMxLCAyMDEyIChzaG93biBpbiBibHVlKS4gVGhlIGNoYXJ0cyBhcmUgZmFjZXR0ZWQgdG8gc2hvdyB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIGFsbGlhbmNlcyBiZWNhdXNlIG1hbnkgb2YgdGhlIGFsbGlhbmNlIHR5cGVzIG92ZXJsYXAuIEZvciBleGFtcGxlLCBvbmUgYWxsaWFuY2UgY291bGQgYmUgYm90aCBhIGRlZmVuc2UgYW5kIGVudGVudGUgYWxsaWFuY2UsIHNvIHRvIGdldCBhIGJldHRlciB2aXN1YWwgcmVwcmVzZW50YXRpb24gd2Ugc2VwYXJhdGVkIHRoZSB0eXBlcyBvZiBhbGxpYW5jZXMuIFdlIGZvY3VzZWQgdGhpcyBwYXJ0IG9mIHRoZSBhbmFseXNpcyBvbiB0aGUgVW5pdGVkIFN0YXRlcywgVW5pdGVkIEtpbmdkb20sIFJ1c3NpYSwgYW5kIEdlcm1hbnkgYmVjYXVzZSB0aGVzZSBjb3VudHJpZXMgYXJlIG1ham9yIHBvd2VycyBhbmQgdGh1cyBhcmUgaW52b2x2ZWQgaW4gbWFueSBvZiB0aGUgbWlsaXRhcnkgYWxsaWFuY2VzIHRocm91Z2hvdXQgaGlzdG9yeS4gCiAKIAoKCioqVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhICoqIAoKI2BgYHtyIGZpZy53aWR0aD03LjUsIGZpZy5oZWlnaHQgPSAgNX0KYGBge3IgZmlnLndpZHRoPTEyLCBmaWcuaGVpZ2h0PTl9CmFsX3VzX3lyIDwtIGZpbHRlcihkaXJfYWxfeWVhciwgZGlyX2FsX3llYXIkc3RhdGVfbmFtZTEgJWluJSAiVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhIikKYWxfdXNfeXIgPC0gZ2F0aGVyKGFsX3VzX3lyLCBUcmVhdHksIGlkaWNhdG9yLCBkZWZlbnNlOmVudGVudGUpICAgCmFsX3VzX3lyIDwtIGFsX3VzX3lyWyFhbF91c195ciRpZGljYXRvciAlaW4lICAwLF0KYWxfdXNfeXIkZHlhZF9lbmRfeWVhclthbF91c195ciRkeWFkX2VuZF95ZWFyICVpbiUgTkFdID0gMjAxNgphbF91c195ciA8LSBhbF91c195clssIGMoNSw4LDExLDE0LDE2KV0KYWxfdXNfeXIkY291bnQgPSAxIAphbF91c195ciRTdGF0dXMgPC0gIiIKYWxfdXNfeXIkU3RhdHVzW2FsX3VzX3lyJGR5YWRfZW5kX3llYXIgPCAyMDEyXSA8LSAiRW5kZWQiCmFsX3VzX3lyJFN0YXR1c1thbF91c195ciRkeWFkX2VuZF95ZWFyPT0gMjAxMl0gPC0gIk9uZ29pbmciCgpnZ3Bsb3QoKSArIAogIHhsYWIoIlllYXIiKSArCiAgeWxhYigiQ291bnRyeSIpKwogIGdlb21fcG9pbnQoZGF0YSA9YWxfdXNfeXIsIGFlcyh4PXllYXIsIHkgPSBzdGF0ZV9uYW1lMiwgY29sb3IgPVN0YXR1cyksIGFscGhhID0gLjUpICsgCiAgZ2VvbV9yZWN0KGRhdGE9ZCwgbWFwcGluZz1hZXMoeG1pbj14MSwgeG1heD14MiwgeW1pbj0iQWZnaGFuaXN0YW4iLCB5bWF4PSJaaW1iYWJ3ZSIsIGZpbGw9Q29uZmxpY3QpLGFscGhhPTAuMTUpICsgCiAgZ2d0aXRsZSgiVVMgQWxsaWFuY2VzICIpKwogIHRoZW1lX2NsYXNzaWMoKSsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9Yygic2FsbW9uIiwgInBhbGV0dXJxdW9pc2UzIiwgImxpZ2h0c3RlZWxibHVlMiIsICJsaWdodHN0ZWVsYmx1ZTQiLCAibGlnaHRzdGVlbGJsdWUzIiwgInBpbmszIikpICsgZmFjZXRfd3JhcCh+dHJlYXR5X3R5cGUsIG5yb3cgPSAxKSsKICBmYWNldF93cmFwKH5UcmVhdHksIG5yb3cgPSAxICkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0icmlnaHQiLCBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gLjUpKSAKCmBgYAoKTG9va2luZyBhdCB0aGUgYWxsaWFuY2VzIGZvciB0aGUgVVMsIHdlIHNlZSB0aGF0IG1vc3QgZGVmZW5zZSBhbGxpYW5jZXMgYXJlIHN0aWxsIGluIGVmZmVjdCB0b2RheS4gVGhlcmUgd2VyZSBoYW5kZnVsIG9mIGFsbGlhbmNlcyB3aXRoIFNvdXRoIEFtZXJpY2FuIGNvdW50cmllcyB0aGF0IGVuZGVkIHRvd2FyZHMgdGhlIGVuZCBvZiBXV0lJIGJ1dCB0aGUgVVMgZW50ZXJlZCBpbnRvIGEgZGlmZmVyZW50IGFsbGlhbmNlIHdpdGggdGhvc2Ugc2FtZSBjb3VudHJpZXMgaW1tZWRpYXRlbHkuIFRoZSB0cmVhdGllcyBpbiBlZmZlY3Qgd2l0aCB0aGUgU291dGggQW1lcmljYW4gY291bnRyaWVzIGlzIHRoZSBJbnRlci1BbWVyaWNhbiBUcmVhdHkgb2YgUmVjaXByb2NhbCBBc3Npc3RhbmNlIChSaW8gUGFjdCkgd2hlcmUgaWYgdGhlcmUgaXMgYW4gYXR0YWNrIGFnYWluc3Qgb25lIGNvdW50cnksIGl0IGlzIGNvbnNpZGVyZWQgYW4gYXR0YWNrIGFtb25nIGFsbCB0aGUgQW1lcmljYXMgY291bnRyaWVzIGluIHRoZSBhbGxpYW5jZS4gVGhpcyBhbGxpYW5jZSB3YXMgY3JlYXRlZCBuIDE5NDkgYW5kIGNvbnRpbnVlcyB0aWxsIHRvZGF5LiAKCllvdSBjYW4gYWxzbyBzZWUgYSBzaW1pbGFyIHBhdHRlcm4gb2Ygb25nb2luZyBhbGxpYW5jZXMgZm9yIGRlZmVuc2UgZW50ZW50ZSBhbmQgbm9uYWdncmVzc2lvbiB0cmVhdHkgdHlwZXMuIE5BVE8sIGEgZGVmZW5zaXZlLCBlbnRlbnRlIGFuZCBub25hZ2dyZXNzaW9uIGFsbGlhbmNlLCB3YXMgZm9ybWVkIGluIDE5NDcgYW5kIGlzIHN0aWxsIGluIGVmZmVjdCB0aWxsIHRvZGF5LiBOQVRPIGludm9sdmVzIDI4IGNvdW50cmllcyBhbmQgYWNjb3VudHMgZm9yIHRoZSBoaWdoIG51bWJlciBvZiBhbGxpYW5jZXMgZm9ybWVkIGluIDE5NDkgZm9yIHRoZSAzIHR5cGVzLiAKClRoZSBlbnRlbnRlIGFsbGlhbmNlcyBmb2xsb3cgYSBzaW1pbGFyIHBhdHRlcm4gd2hlcmUgdGhlIGFsbGlhbmNlIGVuZGVkIGFuZCB3YXMgaW1tZWRpYXRlbHkgcmVmb3JtZWQuIFRoZXJlIHdlcmUgYSBmZXcgY291bnRyaWVzIHdoZXJlIHRoZXJlIHdhcyBhbiBlbnRlbnRlIGFsbGlhbmNlIGZvcm1lZCB0b3dhcmRzIHRoZSBlbmQgb2YgdGhlIEtvcmVhbiBXYXIgYW5kIGVuZGVkIGEgZmV3IHllYXJzIGFmdGVyIHRoZSBlbmQgb2YgdGhlIFZpZXRuYW0gd2FyLiBUaGUgbWFqb3JpdHkgb2YgdGhlIGNvdW50cmllcyB0aGF0IGZvbGxvdyB0aGUgZGVzY3JpYmVkIHBhdHRlcnMgYXJlIGluIEFzaWEgb3IgQXVzdHJhbGlhLiBUaGlzIGlzIHJlYXNvbmFibGUgY29uc2lkZXJpbmcgdGhleSB3ZXJlIHBhcnRpY2lwYW50cyBpcyB0aGUgVmlldG5hbSBXYXIuIEFsc28gdGhlIGRlZmVuc2UgYW5kIGVudGVudGUgYWxsaWFuY2UgYmV0d2VlbiB0aGUgVVMgYW5kIEN1YmEgZW5kZWQgZHVyaW5nIHRoZSBWaWV0bmFtIFdhciwgaW5kaWNhdGVkIGluIHRoZSBncmFwaCBhYm92ZSwgd2hlbiBDdWJhIHdhcyBwcm92aWRpbmcgbWlsaXRhcnkgc3VwcG9ydCB0byB0aGUgVmlldG5hbWVzZS4gQWxzbywgZHVyaW5nIHRoZSBWaWV0bmFtIHdhciwgdGhlcmUgd2FzIGEgbmV1dHJhbGl0eSBhbGxpYW5jZSBmb3IgYSBmZXcgeWVhcnMgYmV0d2VlbiB0aGUgVVMgYW5kIGNvdW50cmllcyB0aGF0IHBhcnRpY2lwYXRlZCBpbiB0aGUgVmlldG5hbSB3YXIuIFRoaXMgYWxsaWFuY2Ugd2FzIGNhbGxlZCB0aGUgSW50ZXJuYXRpb25hbCBBZ3JlZW1lbnQgb24gdGhlIE5ldXRyYWxpdHkgb2YgTGFvcyBzdGFydGluZyBpbiAxOTYxIGFuZCB3YXMgdGVybWluYWRlZCB3aGVuIHdhcyBEZW1vY3JhdGljIFJlcHVibGljIG9mIFZpZXRuYW0gdmlvbGF0ZWQgdGhlIHRlcm1zIG9mIHRoZSB0cmVhdHkgMiB5ZWFycyBsYXRlci4gIAoKKipVbml0ZWQgS2luZ2RvbSAqKiAKCgpgYGB7ciBmaWcud2lkdGg9MTIsIGZpZy5oZWlnaHQ9OX0KZGlyX2FsX3llYXIyIDwtIGZpbHRlcihkaXJfYWxfeWVhciwgZGlyX2FsX3llYXIkZHlhZF9zdF95ZWFyICVpbiUgYygxOTAwOjIwMTYpKQphbF9nYl95ciA8LSBmaWx0ZXIoZGlyX2FsX3llYXIyLCBkaXJfYWxfeWVhcjIkc3RhdGVfbmFtZTEgJWluJSBjKCJVbml0ZWQgS2luZ2RvbSIpKQphbF9nYl95ciA8LSBnYXRoZXIoYWxfZ2JfeXIsIFRyZWF0eSwgaWRpY2F0b3IsIGRlZmVuc2U6ZW50ZW50ZSkgICAKYWxfZ2JfeXIgPC0gYWxfZ2JfeXJbIWFsX2diX3lyJGlkaWNhdG9yICVpbiUgIDAsXQoKYWxfZ2JfeXIgPC0gYWxfZ2JfeXJbLCBjKDMsNSw4LDExLDE0LDE2KV0KYWxfZ2JfeXIkY291bnQgPSAxIAphbF9nYl95ciRTdGF0dXNbYWxfZ2JfeXIkZHlhZF9lbmRfeWVhciA8IDIwMTJdIDwtICJFbmRlZCIKYWxfZ2JfeXIkU3RhdHVzW2FsX2diX3lyJGR5YWRfZW5kX3llYXI9PSAyMDEyXSA8LSAiT25nb2luZyIKCmdncGxvdCgpICsgCiAgeGxhYigiWWVhciIpICsKICB5bGFiKCJDb3VudHJ5IikrCiAgZ2VvbV9wb2ludChkYXRhID1hbF91c195ciwgYWVzKHg9eWVhciwgeSA9IHN0YXRlX25hbWUyLCBjb2xvciA9U3RhdHVzKSwgYWxwaGEgPSAuNSkgKyAKICBnZW9tX3JlY3QoZGF0YT1kLCBtYXBwaW5nPWFlcyh4bWluPXgxLCB4bWF4PXgyLCB5bWluPSJBZmdoYW5pc3RhbiIsIHltYXg9IlppbWJhYndlIiwgZmlsbD1Db25mbGljdCksYWxwaGE9MC4xNSkgKyAKICBnZ3RpdGxlKCJVbml0ZWQgS2luZ2RvbSBBbGxpYW5jZXMiKSsKICB0aGVtZV9jbGFzc2ljKCkrCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoInNhbG1vbiIsICJwYWxldHVycXVvaXNlMyIsICJsaWdodHN0ZWVsYmx1ZTIiLCAibGlnaHRzdGVlbGJsdWU0IiwgImxpZ2h0c3RlZWxibHVlMyIsICJwaW5rMyIpKSArIGZhY2V0X3dyYXAofnRyZWF0eV90eXBlLCBucm93ID0gMSkrCiAgZmFjZXRfd3JhcCh+VHJlYXR5LCBucm93ID0gMSApICsKICB0aGVtZShsZWdlbmQucG9zaXRpb249InJpZ2h0IiwgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IC41KSkgCgpgYGAKCgpUaGUgVW5pdGVkIEtpbmdkb20gZm9sbG93cyB0aGUgc2FtZSBwYXR0ZXJuIGFzIHRoZSBVbml0ZWQgU3RhdGVzLiBNb3N0IG9mIHRoZSBkZWZlbnNlIGFsbGlhbmNlcyBzdGFydGVkIHRvd2FyZHMgdGhlIGVuZCBvZiBXV0lJIGFuZCBhcmUgc3RpbGwgaW4gZWZmZWN0IHRvZGF5LiBUaGUgVW5pdGVkIEtpbmdkb20gaXMgcGFydCBvZiBOQVRPIHNvIHdlIHNlZSBhIGhpZ2ggbnVtYmVyIG9mIGRlZmVuc2UsIGVudGVudGUgYW5kIG5vbi1hZ2dyZXNzaW9uIHRyZWF0eSB0eXBlcyBmb3JtZWQgaW4gMTk0OSBhbmQgY29udGludWUgdGlsbCB0b2RheS4gVGhlIFVLIHdhcyBhbHNvIHBhcnQgb2YgdGhlIE5ldXRyYWxpdHkgb2YgTGFvcyBhbGxpYW5jZSBhbmQgd2UgY2FuIHNlZSB0aGF0IGluIHRoZSBuZXV0cmFsaXR5IHBsb3QuIAoKCioqR2VybWFueSAqKiAKCgpgYGB7ciBmaWcud2lkdGg9MTIsIGZpZy5oZWlnaHQ9Nn0KYWxfZ215X3lyIDwtIGZpbHRlcihkaXJfYWxfeWVhcjIsIGRpcl9hbF95ZWFyMiRzdGF0ZV9uYW1lMSAlaW4lIGMoIkdlcm1hbnkiKSkKYWxfZ215X3lyIDwtIGdhdGhlcihhbF9nbXlfeXIsIFRyZWF0eSwgaWRpY2F0b3IsIGRlZmVuc2U6ZW50ZW50ZSkgICAKYWxfZ215X3lyIDwtIGFsX2dteV95clshYWxfZ215X3lyJGlkaWNhdG9yICVpbiUgIDAsXQoKYWxfZ215X3lyIDwtIGFsX2dteV95clssIGMoNSw4LDExLDE0LDE2KV0KYWxfZ215X3lyJGNvdW50ID0gMSAKYWxfZ215X3lyJFN0YXR1c1thbF9nbXlfeXIkZHlhZF9lbmRfeWVhciA8IDIwMTJdIDwtICJFbmRlZCIKYWxfZ215X3lyJFN0YXR1c1thbF9nbXlfeXIkZHlhZF9lbmRfeWVhcj09IDIwMTJdIDwtICJPbmdvaW5nIgoKZ2dwbG90KCkgKyAKICB4bGFiKCJZZWFyIikgKwogIHlsYWIoIkNvdW50cnkiKSsKICBnZW9tX3BvaW50KGRhdGEgPWFsX2dteV95ciwgYWVzKHg9eWVhciwgeSA9IHN0YXRlX25hbWUyLCBjb2xvciA9U3RhdHVzKSwgYWxwaGEgPSAuNSkgKyAKICBnZW9tX3JlY3QoZGF0YT1kLCBtYXBwaW5nPWFlcyh4bWluPXgxLCB4bWF4PXgyLCB5bWluPSJBZmdoYW5pc3RhbiIsIHltYXg9IlppbWJhYndlIiwgZmlsbD1Db25mbGljdCksYWxwaGE9MC4xNSkgKyAKICBnZ3RpdGxlKCJHZXJtYW55IEFsbGlhbmNlcyIpKwogIHRoZW1lX2NsYXNzaWMoKSsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9Yygic2FsbW9uIiwgInBhbGV0dXJxdW9pc2UzIiwgImxpZ2h0c3RlZWxibHVlMiIsICJsaWdodHN0ZWVsYmx1ZTQiLCAibGlnaHRzdGVlbGJsdWUzIiwgInBpbmszIikpICsgZmFjZXRfd3JhcCh+dHJlYXR5X3R5cGUsIG5yb3cgPSAxKSsKICBmYWNldF93cmFwKH5UcmVhdHksIG5yb3cgPSAxICkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0icmlnaHQiLCBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gLjUpKSAKCgpgYGAKQXMgR2VybWFueSB3YXMgaGVhdmlseSBpbXBhY3RlZCBieSBXV0lJLCB3ZSBzZWUgYWxsIGl0cyBhbGxpYW5jZXMgZW5kIGJ5IHRoZSBlbmQgb2YgdGhlIHdhci4gRHVyaW5nIGl0cyByZWNvdmVyeSBwZXJpb2QsIEdlcm1hbnkgd2FzIG5vdCBhIHBhcnQgb2YgYW55IG1pbGl0YXJ5IGFsbGlhbmNlLiBUaGlzIGlzIHRvIGJlIGFzIGV4cGVjdGVkIHNpbmNlIEdlcm1hbnkgd2FzIHNvIGRldmFzdGF0ZWQgYnkgdGhlIHdhciBpdCBjb3VsZCBub3QgYWZmb3JkIHRvIG1haW50YWluIHRoZSBtaWxpdGFyeS4gR2VybWFueSB3YXMgYWxzbyBnb2luZyB0aHJvdWdoIGEgcGVyaW9kIG9mIGNpdmlsIHVucmVzdC4gSW4gMTk5MCwgR2VybWFueSBqb2luZWQgTkFUTyBhZnRlciBFYXN0IGFuZCBXZXN0IEdlcm1hbnkgY29tYmluZWQgdG8gZnJvbSBhIHVuaWZpZWQgR2VybWFueS4gCgoKCioqUnVzc2lhICoqIAoKCmBgYHtyIGZpZy53aWR0aD0xMiwgZmlnLmhlaWdodD02fQphbF9ydXNfeXIgPC0gZmlsdGVyKGRpcl9hbF95ZWFyMiwgZGlyX2FsX3llYXIyJHN0YXRlX25hbWUxICVpbiUgYygiUnVzc2lhIikpCmFsX3J1c195ciA8LSBnYXRoZXIoYWxfcnVzX3lyLCBUcmVhdHksIGlkaWNhdG9yLCBkZWZlbnNlOmVudGVudGUpICAgCmFsX3J1c195ciA8LSBhbF9ydXNfeXJbIWFsX3J1c195ciRpZGljYXRvciAlaW4lICAwLF0KCmFsX3J1c195ciA8LSBhbF9ydXNfeXJbLCBjKDUsOCwxMSwxNCwxNildCmFsX3J1c195ciRjb3VudCA9IDEgCmFsX3J1c195ciRTdGF0dXNbYWxfcnVzX3lyJGR5YWRfZW5kX3llYXIgPCAyMDEyXSA8LSAiRW5kZWQiCmFsX3J1c195ciRTdGF0dXNbYWxfcnVzX3lyJGR5YWRfZW5kX3llYXI9PSAyMDEyXSA8LSAiT25nb2luZyIKCmdncGxvdCgpICsgCiAgeGxhYigiWWVhciIpICsKICB5bGFiKCJDb3VudHJ5IikrCiAgZ2VvbV9wb2ludChkYXRhID1hbF9ydXNfeXIsIGFlcyh4PXllYXIsIHkgPSBzdGF0ZV9uYW1lMiwgY29sb3IgPVN0YXR1cyksIGFscGhhID0gLjUpICsgCiAgZ2VvbV9yZWN0KGRhdGE9ZCwgbWFwcGluZz1hZXMoeG1pbj14MSwgeG1heD14MiwgeW1pbj0iQWZnaGFuaXN0YW4iLCB5bWF4PSJaaW1iYWJ3ZSIsIGZpbGw9Q29uZmxpY3QpLGFscGhhPTAuMTUpICsgCiAgZ2d0aXRsZSgiUnVzc2lhIEFsbGlhbmNlcyIpKwogIHRoZW1lX2NsYXNzaWMoKSsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9Yygic2FsbW9uIiwgInBhbGV0dXJxdW9pc2UzIiwgImxpZ2h0c3RlZWxibHVlMiIsICJsaWdodHN0ZWVsYmx1ZTQiLCAibGlnaHRzdGVlbGJsdWUzIiwgInBpbmszIikpICsgZmFjZXRfd3JhcCh+dHJlYXR5X3R5cGUsIG5yb3cgPSAxKSsKICBmYWNldF93cmFwKH5UcmVhdHksIG5yb3cgPSAxICkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0icmlnaHQiLCBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gLjUpKSAKCmBgYAoKKipDaGluYSAqKiAKCgoKYGBge3IgZmlnLndpZHRoPTEyLCBmaWcuaGVpZ2h0PTZ9CmFsX2NoaW5hX3lyIDwtIGZpbHRlcihkaXJfYWxfeWVhcjIsIGRpcl9hbF95ZWFyMiRzdGF0ZV9uYW1lMSAlaW4lIGMoIkNoaW5hIikpCmFsX2NoaW5hX3lyIDwtIGdhdGhlcihhbF9jaGluYV95ciwgVHJlYXR5LCBpZGljYXRvciwgZGVmZW5zZTplbnRlbnRlKSAgIAphbF9jaGluYV95ciA8LSBhbF9jaGluYV95clshYWxfY2hpbmFfeXIkaWRpY2F0b3IgJWluJSAgMCxdCgphbF9jaGluYV95ciA8LSBhbF9jaGluYV95clssIGMoNSw4LDExLDE0LDE2KV0KYWxfY2hpbmFfeXIkY291bnQgPSAxIAphbF9jaGluYV95ciRTdGF0dXNbYWxfY2hpbmFfeXIkZHlhZF9lbmRfeWVhciA8IDIwMTJdIDwtICJFbmRlZCIKYWxfY2hpbmFfeXIkU3RhdHVzW2FsX2NoaW5hX3lyJGR5YWRfZW5kX3llYXI9PSAyMDEyXSA8LSAiT25nb2luZyIKCmdncGxvdCgpICsgCiAgeGxhYigiWWVhciIpICsKICB5bGFiKCJDb3VudHJ5IikrCiAgZ2VvbV9wb2ludChkYXRhID1hbF9ydXNfeXIsIGFlcyh4PXllYXIsIHkgPSBzdGF0ZV9uYW1lMiwgY29sb3IgPVN0YXR1cyksIGFscGhhID0gLjUpICsgCiAgZ2VvbV9yZWN0KGRhdGE9ZCwgbWFwcGluZz1hZXMoeG1pbj14MSwgeG1heD14MiwgeW1pbj0iQWZnaGFuaXN0YW4iLCB5bWF4PSJaaW1iYWJ3ZSIsIGZpbGw9Q29uZmxpY3QpLGFscGhhPTAuMTUpICsgCiAgZ2d0aXRsZSgiQ2hpbmEgQWxsaWFuY2VzIikrCiAgdGhlbWVfY2xhc3NpYygpKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCJzYWxtb24iLCAicGFsZXR1cnF1b2lzZTMiLCAibGlnaHRzdGVlbGJsdWUyIiwgImxpZ2h0c3RlZWxibHVlNCIsICJsaWdodHN0ZWVsYmx1ZTMiLCAicGluazMiKSkgKyBmYWNldF93cmFwKH50cmVhdHlfdHlwZSwgbnJvdyA9IDEpKwogIGZhY2V0X3dyYXAoflRyZWF0eSwgbnJvdyA9IDEgKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJyaWdodCIsIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAuNSkpIApgYGAKCgoqKkNvbmNsdXNpb25zKioKClNpbmNlIHdlIGFyZSBtYWlubHkgZm9jdXNpbmcgb24gbGFyZ2Utc2NhbGUgd2FycyB0aGF0IGludm9sdmVkIHZhcmlvdXMgY291bnRyaWVzLCBtYW55IHRyZWF0aWVzIHdlcmUgY3JlYXRlZCBhbmQgYnJva2VuLiBGb3IgZXhhbXBsZSwgV2Fyc2F3IFBhY3Qgd2FzIGNyZWF0ZWQgYXMgYSBjb3VudGVyIHdlaWdodCB0byB0aGUgTkFUTyBQYWN0IGNyZWF0ZWQgYXQgZW5kIG9mIFdXSUkuIFRoZSBVUywgR3JlYXQgQnJpdGFpbiBhbmQgdGhlaXIgYWxsaWVzIGJlY2FtZSBwYXJ0IG9mIE5BVE8gYW5kIHRoZSBTb3ZpZXQgVW5pb24gYW5kIGl0cyBBbGxpZXMgYmVjYW1lIHBhcnQgb2YgdGhlIFdhcnNhdyBwYWN0LiBPbmNlIHRoZSBVU1NSIGRpc3NvbHZlZCBtYW55IG9mIHRoZSBzYXRlbGxpdGUgbmF0aW9ucywgdGhlIFdhcnNhdyBQYWN0IG1lbWJlcnMgam9pbmVkIE5BVE8uIFN1Y2ggbWlsaXRhcnkuIFdpdGggTkFUTyBhbmQgdGhlIGZvcm1hdGlvbiBvZiB0aGUgVW5pdGVkIE5hdGlvbnMsIGl0IGlzIGhhcmQgdG8gc2F5IHdoaWNoIGNvdW50cmllcyB3aWxsIHBhcnRpY2lwYXRlIGluIHRoZSBuZXh0IHdhci4gRm9yIGV4YW1wbGUsIGJlZm9yZSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBXYXIgb24gQWZnaGFuaXN0YW4sIHRoZSBzZWN1cml0eSBjb3VuY2lsIGhhZCB0byBhdXRob3JpemUgdGhlIFVuaXRlZCBTdGF0ZXMgYW5kIE5BVE8gYWxsaWVzIHRvIG9yZ2FuaXplIGFuIG9mZmVuc2l2ZSBhZ2FpbnN0IGFsLVFhZWRhLiBUaGlzIHR5cGUgb2YgcmVndWxhdGlvbiBtYWtlcyBpdCBoYXJkIHRvIGRldGVybWluZSBob3cgZnV0dXJlIHdhcnMgd2lsbCBwbGF5IG91dC4gT25lIHRoaW5nIHRoYXQgd2FzIGludGVyZXN0aW5nIGlzIHRoYXQgb25jZSBhIHRyZWF0eSBmYWxscyBhcGFydCwgdGhlIG1lbWJlcnMgdHJ5IHRvIGpvaW4gYW5vdGhlciB0cmVhdHkgd2hpY2ggaXMgd2h5IHdlIHNlZSBzcGlrZXMgaXMgdGhlIG1lZGlhbiBudW1iZXIgb2YgYWxsaWFuY2VzIHRvd2FyZHMgdGhlIGVuZCBvZiB0aGUgd2Fycy4gCgpPbmUgb2YgdGhlIHRoaW5ncyB0aGF0IHdhcyBoYXJkIHRvIHdvcmsgd2l0aCB0aGlzIGRhdGEgc2V0IGlzIHRoYXQgaXQgd2FzIGltcG9zc2libGUgdG8gdGVsbCB3aGljaCBhbGxpYW5jZXMgd2VyZSBwYXJ0IG9mIGEgbGFyZ2VyIHRyZWF0eS4gRm9yIGV4YW1wbGUsIGlmIHRoZXJlIHdhcyBhIGRhdGEgcG9pbnQgZm9yIGFuIGFsbGlhbmNlIGJldHdlZW4gdGhlIFVTIGFuZCB0aGUgVUsgaW4gMTk2NywgdGhlcmUgd2FzIG5vIGluZGljYXRpb24gb2YgaWYgaXQgd2FzIE5BVE8gb3Igc29tZSBvdGhlciB0cmVhdHkuICBUaGlzIGFsc28gbWFkZSBpdCBoYXJkIHRvIHRlbGwgd2hlbiBhIGNvdW50cnkgam9pbmVkIGFuIGV4aXN0aW5nIGFsbGlhbmNlLiBGb3IgZXhhbXBsZSwgd2hlbiBHZXJtYW55IGpvaW5lZCBOQVRPIHRoZXJlIHdlcmUgZGF0YSBwb2ludHMgZm9yIGFuIGFsbGlhbmNlIGJldHdlZW4gR2VybWFueSBhbmQgdGhlIE5BVE8gbWVtYmVycyBidXQgaXQgaXMgbm90IGVhc3kgdG8gZGlzY2VybiB0aGF0IEdlcm1hbnkgam9pbiBOQVRPIHdpdGhvdXQgc29tZSBpbnRlcm5ldCByZXNlYXJjaC4gCgpUaGUgb3RoZXIgZG93bmZhbGwgb2YgdGhpcyBkYXRhIHNldCBpcyB0aGF0IGl0IG9ubHkgY29uc2lkZXJzIGZvcm1hbCBtaWxpdGFyeSBhbGxpYW5jZXMuIEl0IHdpbGwgbm90IHRha2UgaW50byBhY2NvdW50IG90aGVyIHR5cGVzIG9mIGFsbGlhbmNlcyBzdWNoIGFzIHRoZSBVbml0ZWQgTmF0aW9ucyAmIHNlY3VyaXR5IGNvdW5jaWwgb3IgYSB0cmFkZSBhZ3JlZW1lbnQuIEZvciBleGFtcGxlLCBKYXBhbiBpcyBub3QgaW4gYW55IG1pbGl0YXJ5IGFsbGlhbmNlIGN1cnJlbnRseSBidXQgaXQgZG9lcyBoYXZlIHZlcnkgY2xvc2UgdGllcyB0byB0aGUgVW5pdGVkIFN0YXRlcyB0b2RheSwgYW5kIHRoaXMgaW5mb3JtYXRpb24gaXMgbm90IGNhcHR1cmVkIGluIHRoZSBkYXRhIHNldC4gCgogIAoqKlRyYWRlKiogCiAgIAogICAgIAoqKk1pbGl0YXJpemVkIEludGVyc3RhdGUgRGlzcHV0ZXMqKiAKICAKICAKIyMgQ29uY2x1c2lvbiAKKipEaXNjdXNzIGxpbWl0YXRpb25zIGFuZCBmdXR1cmUgZGlyZWN0aW9ucywgbGVzc29ucyBsZWFybmVkKioKCiMjIFNvdXJjZXMgCgo=